我有Activity
A(launchMode
是singleTask
)和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,对吗?
我怎么能禁止这种行为?提前谢谢。
答案 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活动开始时的所有地方。