Android 在接收同一广播时完成两项活动

Android 在接收同一广播时完成两项活动,android,broadcastreceiver,android-activity,Android,Broadcastreceiver,Android Activity,我有一个BroadcastReceiver,它处理系统广播,例如连接和断开交流。BroadcastReceiver接收连接的POWER\u并启动活动“main Activity”,该活动解锁KeyGuard并获取WakeLock。在onCreate和onResume中,我动态注册了一个BroadcastReceiver,以收听POWER\u DISCONNECTED “Main活动”启动第二个“VideoPlayer活动”,该活动还注册了一个广播接收器监听电源断开 当我通过adb发送操作\u电源

我有一个
BroadcastReceiver
,它处理系统广播,例如连接和断开交流。
BroadcastReceiver
接收连接的
POWER\u
并启动活动“main Activity”,该活动解锁
KeyGuard
并获取
WakeLock
。在
onCreate
onResume
中,我动态注册了一个
BroadcastReceiver
,以收听
POWER\u DISCONNECTED

“Main活动”启动第二个“VideoPlayer活动”,该活动还注册了一个
广播接收器
监听
电源断开

当我通过adb发送
操作\u电源\u断开连接时
,我通过LogCat看到“MainActivity”首先停止。为什么?

如何处理“VideoPlayerActivity”首先完成的问题

谢谢你看这里():

正常广播(与Context.sendBroadcast一起发送)是完全异步的广播的所有接收器都以未定义的顺序运行,通常同时运行。这更有效,但意味着接收器不能使用此处包含的结果或中止API

您不能保证VideoPlayerActivity将收到

我建议创建一个单独的BroadcastReceiver(这不是活动的一部分)。在这个广播接收器中,执行如下操作:

videoPlayerActivity.finish();
mainActivity.finish();

当然,您需要在活动的onCreate或onResume中初始化这两个变量。

实际上,您在主活动中注册了广播接收器,因此它将在广播接收器中传递主活动的上下文,因此我只能完成该活动

因此,让我们把这件事搞砸你需要做的就是在电源断开的操作接收器的onReceive()中写入以下代码行:

public void onReceive(Context context, Intent intent) {
 Intent startMain = new Intent(Intent.ACTION_MAIN);
            startMain.addCategory(Intent.CATEGORY_HOME);
            startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(startMain);
}

享受

这两个活动都有自己的接收者作为内部类实现。也许可以通过自定义广播停止第二次启动的活动,以便与电源连接意图无关。我将在第一个活动中使用此广播,但在第二个活动中发送第二个接收器将使用的自定义广播。这样我就可以告诉他完成。在发送自定义广播之后,我将完成onReceive方法中的主要活动。我试试这个。我认为你所描述的应该有用。然而,我只是不喜欢将广播接收者和活动组合在一个实体中。主要原因是单一责任原则(),我同意你的观点。但当我不知道这两种活动的实例时,我如何解决这个问题。BrodCastReceiver在其自己的类中是独立于活动的。您只需将这两个活动的实例保存在每个活动的oCreate/oResume中。您可以将它们保存到一些静态成员中,或者创建一个包含静态成员的独立类。稍后,broadcastactivity可以从这些静态成员读取它。我通过给创建的接收者一个优先级解决了这个问题。子活动的优先级为2,主活动的优先级为1。这是可行的,但之后的问题是,子活动会消耗广播。主要的活动从来没有播出过。唯一的方法,我认为最好的(?)是在主活动中捕获广播,并在完成主活动之前向子活动发送自定义广播。这对我有帮助!