6

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

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

如果不可能以任何方式将一些 java 代码拆分为多个文件,那么我的主要文件有 600 多行。(关于信息,我已经有 19 个 Java 文件用于我的应用程序的 alpha 版本,所以我尝试拆分它)

4

2 回答 2

18

动态创建广播接收器:

在您的 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);

最后,当 yourBR.onReceive 被触发时,您可以调用:

yourMain.methodOfMainActivity();
于 2013-06-05T08:01:20.583 回答
2

#使您的 BroadcastReceiver 独立于 Activity 在此处输入图像描述 创建一个BroadcastReceiver内部类Activity以便它可以从其onReceive()方法访问 UI 元素只是没有意义。如果你这样做,你就不能在BroadcastReceiver任何其他活动中重复使用。你最终会一次又一次地编写几乎相同的代码。
一个更好的方法是,做一个 CallbackBroadcastReceiver并让你的 Activity 订阅这个 Callback

我怎么做?

1)创建回调接口

public interface ReceiverCallback{

      public void doSomething(Object object);

}

2) 在 BroadcastReceiver 中提供您的回调

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)
          callback.doSomething(null);             //<--Send callback event

     }
}

3) 订阅您的活动以获取回调事件:

public YourActivity extends AppCompatActivity implements ReceiverCallback{

      // Your Activity code 

      public void updateUI() {     //<-- You want this to get Triggered 
             // Update UI code 
      }

      @Override
      public void doSomething(Object object){     
            updateUI();            //<-- Callback does that
      }

}

##Relevant Link:在此处阅读更详细的讨论

于 2019-01-27T07:45:28.237 回答