Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 多活动中的动态广播接收机_Android_Broadcastreceiver_Android Broadcastreceiver - Fatal编程技术网

Android 多活动中的动态广播接收机

Android 多活动中的动态广播接收机,android,broadcastreceiver,android-broadcastreceiver,Android,Broadcastreceiver,Android Broadcastreceiver,我对这种典型场景缺乏文档感到困惑。我的Android应用程序中有4个活动-A、B、C和D。我在活动A中注册了一个WiFi P2p广播接收器。一旦连接,用户可以在活动B、C和D之间切换,并可以通过按“最近的应用程序”菜单中的“主页”按钮/终止来退出/终止应用程序。我应该在哪里注销广播接收器?在单个活动中,您将在onResume()方法中注册并在onPause()中注销。多个活动怎么样?在我看来,我可能不得不为每项活动注册和注销,这似乎不太正确 相关代码: // helper class metho

我对这种典型场景缺乏文档感到困惑。我的Android应用程序中有4个活动-A、B、C和D。我在活动A中注册了一个WiFi P2p广播接收器。一旦连接,用户可以在活动B、C和D之间切换,并可以通过按“最近的应用程序”菜单中的“主页”按钮/终止来退出/终止应用程序。我应该在哪里注销广播接收器?在单个活动中,您将在onResume()方法中注册并在onPause()中注销。多个活动怎么样?在我看来,我可能不得不为每项活动注册和注销,这似乎不太正确

相关代码:

// helper class method called by Activity A by passing its context.
private void registerReceiver(Context context) {
    context.registerReceiver(p2pBroadcastReceiver, p2pIntentFilter);
}

很抱歉,如果这听起来太简单,请告诉我正确的文档/链接

启动活动B、C和D时,您可以在相应活动B、C和D的生命周期回调方法中注销广播接收器

例如,在活动B中,您可以在活动B的onPause方法中注销广播接收器

public class MyActivity extends Activity 
{
private final BroadcastReceiver mybroadcast = new SmsBR();
 public void onPause() 
   {
     super.onPause();
     unregisterReceiver(mybroadcast);
   }
}

即使应用程序被系统或用户杀死,Android框架仍将调用所有生命周期回调方法。因此,如果您在onPause()中注销,当活动转到后台或被终止时,它将被调用。

那么您是说我应该在onresume中注册,并在每个活动的onPause中注销?我不知道您的应用程序活动流,但有一种情况是,如果您按照以下顺序启动活动A->B->C->D,因此,任务backstack将活动D作为头活动,这是第一次弹出,并调用其生命周期回调方法。如果您在活动D中注销,这就足够了,因为您不需要先在活动C、活动B中注销,然后在活动A中注销。对于您的特定用例,根据活动本身的功能,知道首先弹出哪个活动,或者需要在哪里注销。活动流是,用户从A中开始查找要连接的对等方,一旦通过WiFi直接连接,移动到活动B,将其用作菜单活动。从那里,用户可以移动到C和D。我在A中注册,理想情况下,我只希望在广播接收器退出应用程序时取消注册。@CrearoRotar当您在活动A中注册它时,它是取消注册的适当位置,因为,如果您在活动C中有一些需要接收器的功能,那么即使活动D被破坏,它仍然可以工作。简单的经验法则是为您的用例绘制任务backbackback,并检查您是否需要所有这些任务中的broacast接收器。如果答案是“是”,则在backbacks last activity(tail)中注销,或者在您认为back stack中的下一个活动不需要接收器的活动中注销。如果这有助于将此答案标记为已接受,则对其他用户有用。不要担心,此操作不会占用太多资源,因此我们可以在多个位置多次注册/注销。另一种方法是在后台服务中注册/注销,让我知道您对这个用例做了什么。