我已经创建了一个主要活动的浏览器应用程序,它响应了以下意图:
<intent-filter>
<data android:scheme="http"/>
<data android:scheme="https"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<action android:name="android.intent.action.VIEW"/>
</intent-filter>
如果我选择了我的应用程序,在其他任务(gmail,sms)上点击url,活动将在与调用任务相同的任务中打开。 当我选择不同的浏览器(Mozila firefox,chrome,dolphine)时,他们正在开设不同的任务。
查看其他浏览器清单,我看到没有人使用 android:launchMode =&#34; singleTask&#34; 。
我不想使用单一任务标记,因为它不是谷歌推荐的,也是我的其他问题。
我试图了解其他浏览器是如何做到这一点但却没有弄清楚。
任何想法?有没有其他方法可以在不使用singleTask标志的情况下在不同的任务中打开我的活动?
答案 0 :(得分:2)
如果活动在单个任务中运行,您可以签入onCreate。如果不只是完成()它并使用FLAG_ACTIVITY_NEW_TASK再次创建
这可能对您有所帮助
ActivityManager activityManager = (ActivityManager) ctx.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningTaskInfo> tasks = activityManager.getRunningTasks(Integer.MAX_VALUE);
for (RunningTaskInfo task : tasks) {
if (ctx.getPackageName().equalsIgnoreCase(task.baseActivity.getPackageName()))
// check if it's the only one activity or whatever
}
答案 1 :(得分:2)
我在Android开发者site上找到了以下说明:
另一个例子,Android Browser应用程序声明了 Web浏览器活动应始终在其自己的任务中打开 - 通过指定 元素中的singleTask启动模式。这意味着 如果您的应用程序发出打开Android浏览器的意图,那么 活动未与您的应用程序放在同一任务中。代替, 要么为浏览器启动新任务,要么已经启动浏览器 有一个在后台运行的任务,该任务被提前 处理新意图。
正如您所看到的,android:launchMode=singleTask
是您的正确选择。你已经提到你有这个属性的问题所以也许让我们专注于它们。
更新28.05.2014
Google关于singleTask launchMode的注释:
来自Google的其他模式 - singleTask和singleInstance - 不合适 对于大多数应用程序,因为它们会产生一个交互模型 用户可能不熟悉,与大多数用户不同 其他应用程序。
singleTask和singleInstance用例:
专业发布(不推荐用于一般用途)
正如您所看到的,singleTask可能不建议用于一般用途,但您的情况并非一般,实际上它是singleTask完美匹配的情况之一。 换句话说,不禁止使用singleTask,只需要谨慎使用,以便为最终用户提供应用程序的常见体验。
我希望我现在为你说清楚。在您的情况下,您可以使用此启动模式。
答案 2 :(得分:1)
你正在努力弯曲规则&#34;一点点,如果你不使用android:launchMode="singleTask"
,你就不能清楚自己要避免的事情。
所以我建议研究:
创建Service
并让Service
听取意图过滤器。然后让Service
打开您的Activity
,并正确设置Activity
的亲和力以匹配Service
。这将允许您克服关联性未正确绑定Activity
的问题。
让无声的Activity
开始新Activity
并退出。静默Activity
将在新堆栈中启动(不是在单一任务模式下),并且在启动您实际需要的Activity
时会自行关闭。