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。这是可行的,但之后的问题是,子活动会消耗广播。主要的活动从来没有播出过。唯一的方法,我认为最好的(?)是在主活动中捕获广播,并在完成主活动之前向子活动发送自定义广播。这对我有帮助!