从BroadcastReceiver类调用activity方法

时间:2013-06-05 07:55:16

标签: android broadcastreceiver inner-classes

我知道我可以做一个内部接收器类来调用接收器中的任何方法

但我的主要活动太大了,做了很多事情。 所以我需要一个扩展广播接收器但不是内部类的类。并且可以从我的主要活动中调用一个方法。我不知道是否可能,但我的活动是家庭活动和“单一实例”活动,所以也许有了这个细节,有人可以访问我的活动。

如果不可能以任何方式将多个java代码拆分成多个文件,那么我的主要代码超过600行。 (并且对于我的应用程序的alpha版本,我已经有19个java文件,因此我尝试将其拆分)

2 个答案:

答案 0 :(得分:18)

动态创建BroadcastReceiver:

在您的BroadcastReceiver类中定义类成员:

YourMainActivity yourMain = null;  

和方法:

setMainActivityHandler(YourMainActivity main){
yourMain = main;
}  
来自您的MainActivity的

private YourBroadcastReceiverClassName yourBR = null;
yourBR = new YourBroadcastReceiverClassName();
    yourBR.setMainActivityHandler(this);    
    IntentFilter callInterceptorIntentFilter = new           IntentFilter("android.intent.action.ANY_ACTION");
    registerReceiver(yourBR,  callInterceptorIntentFilter);

最后,当你的BR.onReceive被解雇时,你可以打电话给:

yourMain.methodOfMainActivity();

答案 1 :(得分:0)

使您的BroadcastReceiver独立于活动

enter image description here 创建BroadcastReceiver的{​​{1}}内部类,使其可以通过其Activity方法访问UI元素是没有意义的。如果这样做,您将无法将onReceive()与其他任何活动重复使用。这样您将一次又一次地编写几乎相同的代码。
更好的方法是BroadcastReceiver进行回调,然后让您的活动订阅该回调

  

我该怎么做?

1)创建回叫界面

BroadcastReceiver

2)在BroadcastReceiver中提供您的回调

public interface ReceiverCallback{

      public void doSomething(Object object);

}

3)为回调事件订阅您的活动:

public class MyBroadcastReceiver extends BroadcastReceiver {

     private ReceiverCallback callback;

     public MyBroadcastReceiver(ReceiverCallback callback){

          this.callback = callback;        //<--Initialize this
     }

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

           // Your listening logic goes here (New WIFI Scan data available, 
                                              Headphone plugged in etc)              

          // Send any data or No data(null)
          listener.doSomething(null);             //<--Send callback event

     }
}

相关链接:

阅读更详细的讨论HERE