打破任务障碍

时间:2010-02-17 06:57:37

标签: android

我有一个Android应用程序。我为我的一个活动添加了一个intent过滤器,这样如果在浏览器应用中点击了一个url,我的活动就可以启动了。看起来像这样:

<data android:host="www.mysite.com" android:scheme="http"></data>

这很有效。问题是每次从浏览器启动我的活动时,都会在浏览器应用程序的任务中创建一个新的活动实例,而不是回收已经存在于系统中的任何现有实例。

这对我来说是个问题,因为此活动使用单身人士。如果我允许存在多个此活动的实例,我可以进入一些奇怪的情况,当两个实例尝试共享单例时发生冲突。我检查过并且可以看到虽然活动实例可能在单独的任务中,但它们共享相同的单例实例。

对我来说,一个理想的解决方案是,如果我可以以某种方式将我的应用程序的预先存在的实例带到前台,并在我的应用程序的任何预先存在的实例正好运行的情况下启动或恢复目标活动。

所以我尝试了这个:

  1. 在上面的过滤器中注册以指向虚拟活动,这只是一个捕手。
  2. 虚拟活动会创建广播意图,并尝试向系统广播“创建我”消息。
  3. 设置真实目标活动以侦听此广播消息。希望如果系统中已经有一个活动实例,它将会出现在前台。如果还没有实例,那没关系,允许在浏览器任务中创建。
  4. 不确定这是否有意义。我的基本目标是将活动限制在系统中的一个实例。该应用程序只是社交媒体应用程序,具有需要保留的登录状态。上面提到的单例保留了登录状态,所以我想在系统中只有一个,而不是允许多个登录实例运行,这将是用户的头痛。

    由于

1 个答案:

答案 0 :(得分:0)

您可以将活动启动模式设置为singleTop以实现此目的。

机器人:launchMode 关于如何启动活动的说明。有四种模式与Intent对象中的活动标志(FLAG_ACTIVITY_ *常量)结合使用,以确定在调用活动处理意图时应该发生什么。他们是: “标准” “singleTop” “singleTask” “singleInstance” 默认模式为“标准”。

https://developer.android.com/guide/topics/manifest/activity-element.html#lmode