简体   繁体   中英

How do I access my UI from MainActivity from Broadcast Receiver class

I am new to Android Studio and I am creating a custom notification app, and I wanted to use the EditText from my MainActivity class in Broadcast Receiver class. How can I do that?

Broadcast Receiver code:

`package com.example.notificationscreator;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.widget.EditText;

import androidx.core.app.NotificationCompat;
import androidx.core.app.NotificationManagerCompat;

public class MyReceiver extends BroadcastReceiver {


    @Override
    public void onReceive(Context context, Intent intent) {

        NotificationCompat.Builder Build = new NotificationCompat.Builder(context, "Notified");
        Build.setSmallIcon(R.drawable.ic_stat_name);
        Build.setContentTitle("");
        Build.setStyle(new NotificationCompat.BigTextStyle().bigText(""));
        NotificationManagerCompat Managercompats = NotificationManagerCompat.from(context);
        Managercompats.notify(1, Build.build());
    }




}`

Main activity code:

`package com.example.notificationscreator;

import static com.example.notificationscreator.R.*;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.NotificationCompat;
import androidx.core.app.NotificationManagerCompat;

import android.app.AlarmManager;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.os.SystemClock;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import java.util.Calendar;
import java.util.Random;

public class MainActivity2 extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(layout.activity_main2);
        Button btnmain = findViewById(R.id.button4);
        Button Displaynotif = findViewById(R.id.button3);
        EditText Timedisplay = findViewById(R.id.editTextTime);
        Integer Time = Integer.parseInt(Timedisplay.getText().toString());
        btnmain.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Backmainpage();
            }
        });
        if(Build.VERSION.SDK_INT >=Build.VERSION_CODES.O){
            NotificationChannel channel = new NotificationChannel("Notified","Notification", NotificationManager.IMPORTANCE_HIGH);
            NotificationManager manager = getSystemService(NotificationManager.class);
            manager.createNotificationChannel(channel);
        }
        Displaynotif.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                int Randnum = new Random().nextInt(80);
                Intent intent= new Intent(MainActivity2.this,MyReceiver.class);
                PendingIntent pendingintention = PendingIntent.getBroadcast(MainActivity2.this,0, intent,0);
                AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
                long timeonclick = System.currentTimeMillis();
                long timeafterclick = 10000;
                am.set(AlarmManager.RTC_WAKEUP,timeonclick+timeafterclick,pendingintention);
            }
        });
    }
    public void Backmainpage(){
        Intent intention2 = new Intent(this,MainActivity.class);
        startActivity(intention2);
    }


}`

I've tried recalling Main Activity using MainActivity2 Mainactivity = new MainActivity2(); but I still can't access the UI from Main Activity

You can use another BroadcastReceiver to communicate with your activity like below example.

add the following code inside your broadcast receiver .

 @Override
 public void onReceive(Context context, Intent intent) {
     //... your other code

     Intent intent = new Intent();
     intent.setAction("CustomAction"); // use your action name
     intent.putExtra("key", "Value");  // you can pass data like this
     context.sendBroadcast(intent); // fire broadcast receiver
}

Now, register your custom broadcast receiver from Activity

@Override
protected void onResume() {
   super.onResume();

   IntentFilter filter = new IntentFilter();
   filter.addAction("CustomAction"); // use your custom action name
   BroadcastReceiver updateUIReciver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                //You will get your data here
                //Update UI based on your data.

                if (intent != null) {
                    String data = intent.getStringExtra("key");
                }
            }
   };
   registerReceiver(updateUIReciver, filter); // register broad cast receiver.
}
 public class MainActivity2 extends AppCompatActivity {
    EditText Timedisplay;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(layout.activity_main2);
      Timedisplay = findViewById(R.id.editTextTime);


      //register your broadcast here   
      LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver, new IntentFilter("messageevent"));
   }
 }      

  private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, final Intent intent) {
        // Get extra data included in the Intent
        String message = intent.getStringExtra("key");
        Log.e(TAG, "Got message: " + message);
        if(message != null && !message.isEmpty()) {
            //Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
            String timedisplay = Timedisplay.getText();
        }
    }
 };

 //call this from anywhere you want to trigger the broadcoast
 Intent i = new Intent("messageevent");
 // You can also include some extra data.
 i.putExtra("key", "value");
 LocalBroadcastManager.getInstance(CheckUpdate.this).sendBroadcast(i);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM