call activity method from broadcast receiver

后端 未结 5 1870
小蘑菇
小蘑菇 2020-12-03 11:33

In the main activity, a layout is loaded that has some input fields and a submit button. When the submit button is clicked, the onClick handler method sends an sms back to t

相关标签:
5条回答
  • 2020-12-03 11:33

    It's a little bit late, but nobody mentioned it. There is no need for passing activity. As @faizal specifies, IntentService is started from MainActivity, so, context in onReceive() is already instance of MainActivity. It is enough to write smth like this:

    @Override
    public void onReceive(Context context, Intent intent) {
        if(context instanceof MainActivity) {
            MainActivity activity = (MainActivity) context;
        }
    }
    
    0 讨论(0)
  • 2020-12-03 11:36

    Pass your Activity's context to BroadcastReceiver's contructor.

    public class SmsReceiver extends BroadcastReceiver{
    
        MainActivity ma; //a reference to activity's context
    
        public SmsReceiver(MainActivity maContext){
            ma=maContext;
        }
    
        @Override
        public void onReceive(Context context, Intent intent) {
            ma.brCallback("your string"); //calling activity method
        }
    
    }
    

    and in your MainActivity

    public class MainActivity extends AppCompatActivity {
        ...
        public void onStart(){
            ...        
        SmsReceiver smsReceiver = new SmsReceiver(this); //passing context
        LocalBroadcastManager.getInstance(this).registerReceiver(smsReceiver,null);
            ...
        }
    
        public void brCallback(String param){
            Log.d("BroadcastReceiver",param);
        }
    }
    

    hope it helps

    0 讨论(0)
  • 2020-12-03 11:39

    use this

    Intent intent=new Intent();
    intent.setClassName("com.package.my", "bcd.class");
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    
    context.startActivity(intent);
    
    0 讨论(0)
  • 2020-12-03 11:40

    Thanks @Manishika. To elaborate, making the Broadcastreceiver dynamic, instead of defining it in the manifest, did the trick. So in my broadcast receiver class, i add the code :

    MainActivity main = null;
    void setMainActivityHandler(MainActivity main){
        this.main=main;
    }
    

    In the end of the onReceive function of the BroadcastReceiver class, I call the main activity's function :

    main.verifyPhoneNumber("hi");
    

    In the main activity, I dynamically define and register the broadcast receiver before sending the sms:

    SmsReceiver BR_smsreceiver = null;
    BR_smsreceiver = new SmsReceiver();
    BR_smsreceiver.setMainActivityHandler(this);
    IntentFilter fltr_smsreceived = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
    registerReceiver(BR_smsreceiver,fltr_smsreceived);  
    
    0 讨论(0)
  • 2020-12-03 11:56

    You can't directly call a function in your Activity unless it's a public static method but don't do so. I recommend this:

    @Override
    public void onReceive(Context context, Intent intent) {
        Bundle bundle = new Bundle();
        bundle.putExtraString("ACTION", "stopBroadcast");
    
        // ### put what ever you need into the bundle here ###
    
        Intent intent = new Intent();
        intent.setClassName(context, "activity.class");
        intent.putExtras(bundle);
    
        context.startActivity(intent);
    }
    

    And then from your Activity's onCreate() get Bundle and take your actions as needed.

    0 讨论(0)
提交回复
热议问题