从BroadcastReceiver启动新活动将恢复已存在的活动

时间:2016-11-16 14:29:22

标签: android android-intent android-activity

我有Activity A(launchModesingleTask)和B.在onCreate()的A中,我触发了一个警报,它会激活一个BroadcastReceiver一段时间后。然后我按下主页按钮隐藏A。

BroadcastReceiver' onReceive()中,将执行以下代码:

Intent intent = new Intent(context, B.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);

然后我发现B正常发射,但A也会恢复。我不知道为什么,也不喜欢这种行为。

让我们想象一下:用户打开了你应用的Activity A,按下主页按钮,打开了另一个应用的Activity B,然后是BroadcastReceiver已激活并且您的应用程序的Activity C已打开,用户在那里做了一些事情,然后他按下了按钮。他应该看B而不是A,对吗?

我怎么能禁止这种行为?提前谢谢。

3 个答案:

答案 0 :(得分:2)

我自己找到了一个合适的解决方案......

Activity中的AndroidManifest.xml A添加Activity(与您应用的包名不同的任何字符串,并且至少包含一个点是好的)。

原因?当使用FLAG_ACTIVITY_NEW_TASK启动taskAffinity时,它会检查是否存在具有相同android:taskAffinity="..."的任务。如果是,它不会创建新任务,但会直接推送到该任务。在我们的情况下,由于我们没有写taskAffinity,因此所有活动都具有相同的BroadcastReceiver。因此,当从FLAG_ACTIVITY_MULTIPLE_TASK启动B时,它会被添加到默认的应用程序任务中,其中也存在A. 我认为,然后默认的应用程序任务将被激活,其中的所有活动将被推入后端堆栈的顶部。然后我们知道结果:在B中按回按钮将引导我们进入A.

其他行为改变了吗?是的。如果使用此方法,B除非使用一个标记启动它,否则不能有多个实例:BroadcastReceiver

有趣的相关发现?是的。我发现如果按下A中的主页按钮并在5秒钟内快速启动bw.setWord();中的B,则B将在延迟后显示。但是如果B在更多秒后启动,它将显示得非常快。这是Android系统的保护,有关详细信息,您可以参考Delay while launching activity from service。相信我,这非常非常不引人注意但很有趣(而且没有解决方案:)。

答案 1 :(得分:0)

我认为您需要再添加一个标记Intent.FLAG_ACTIVITY_NO_HISTORY

Intent intent = new Intent(context, B.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_HISTORY);
context.startActivity(intent);

应用程序的当前行为可以在this answer中解释。 如链接答案所示,

  

如果您的应用已在运行,Android只会将活动启动到该任务中。

所以额外的标志Intent.FLAG_ACTIVITY_NO_HISTORY会有所帮助。

修改

根据评论中的讨论, 您可以检查您的活动是在后台还是前台(this可以提供帮助),并根据结果使用Intent标记Intent.FLAG_ACTIVITY_CLEAR_TASK

答案 2 :(得分:0)

只需在AndroidManifest.xml中为B Activity添加一行设置。

android:launchMode="singleInstance"

使用最简单的方法启动B活动

context.startActivity(new Intent(context,B.class));

但这种方式存在问题,它将影响B活动开始时的所有地方。