问题标签 [launchmode]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
183 浏览

android - 对启动模式感到困惑

我有调用 B 的活动 A,此时假设用户按下主页按钮:

1)如果用户长按home键并调出最近启动的应用程序,它将把用户带回活动B。

2)如果用户通过快捷方式打开我的应用程序(按下应用程序的图标),它将创建另一个Activity A实例。

我没有为我的活动设置任何启动模式,所以我猜它是launchMode="standard",我想要的默认行为是返回活动 B。

为什么会发生第 2 点?我一直认为这两种行为都会导致相同的结果。

0 投票
4 回答
5295 浏览

android - android - launchMode=singleTask 和通知?

我知道我要问的内容有一些帖子,但我找不到任何正确答案。

据我了解,如果您的主要活动(我们称其为 A)launchMode 设置为 singleTask,并且 A 已启动活动 B,则单击主页按钮将破坏历史堆栈并重新启动应用程序将带您回到 A而不是 B。

我已将 launchMode 设置为 singleTask,因为我有一个持久通知,并且我不希望在用户单击通知时出现多个主要活动实例。

有什么我想念的东西可以让我同时满足两者吗?

所以我问是否有一种方法可以确保无论何时用户希望启动应用程序,无论是否通过通知,都可以将他带回上一个(当前)活动。

如果我将 launchMode 更改为 singleTop 它可以工作,但是每当我启动它时我都会获得主要活动的多个实例。

谢谢

安德烈亚斯

0 投票
1 回答
6485 浏览

android - 单次_TOP | CLEAR_TOP 似乎在 95% 的时间内都有效。为什么是 5%?

我有一个即将完成的应用程序,它具有非平凡的活动结构。有与此应用程序相关的推送通知,无论应用程序是前台/后台/非活动状态,选择通知条目都应该会调出特定活动。

如果应用程序未处于活动状态,我已经能够成功启动应用程序并自动导航到相应的部分。但是,当应用程序处于活动状态时,我遇到了问题。我将介绍问题的简化版本,以传达问题的性质,并根据需要发布我的应用程序活动结构和相关代码的详细信息(实际上,现在正在处理)。

因此,我的应用程序的活动堆栈(大大简化)如下所示:

A -> B -> X

其中A,根活动,是一个登录页面;B 有点像“主页”,X 是可以从主页启动的几个活动之一(但一次只有一个活动实例;因为这些只能从 B 启动)。

选择通知后,我需要应用程序自动导航到 B,无论它事先处于什么状态 - 无论是 [A]、[A -> B]、[A -> B -> X] 还是 [] (应用程序未激活)。

我的通知将 Intent 传递给活动 A。我尝试使用 CLEAR_TOP 和 NEW_TASK 标志,但没有。A 当前有launchmode=singleTask。这样做,我认为我正在解决所有可能的现有堆栈配置并将它们减少到 [A]。Intent 还带有一个额外的内容,将其标识为来自通知,而不是通常的启动。

Activity A,在将 Intent 识别为从通知发送时(它可以在 onCreate() 和 onNewIntent() 中执行此操作),向 Activity B 发送 Intent。此 Intent 包含 CLEAR_TOP 和 SINGLE_TOP。B 有launchmode=singleTop。

95% 的情况下,这可以按预期工作,并且在按下通知后,应用程序的堆栈为 [A -> B]。大约 5% 的时间,应用程序以某种方式以 [A -> B -> B] 堆栈结束。

关于这里发生的事情的任何想法,或者我做错了什么?

如果这是一个不平凡的问题,我会发布更多细节。事实上,现在发布更多细节......

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~

单步调试调试器表明,每次 A 向 B 发送其意图时,B 的现有实例在被 onCreate() 之前是 onDestroy(),然后也调用了它的 onNewIntent()。这对我来说似乎很奇怪,并且表明我误解了我正在使用的标志(CLEAR_TOP 和 SINGLE_TOP),或者有其他东西干扰了它们。

我在调试中没有成功重现错误的堆栈结构。不知道是不是因为它没有在调试中发生,或者我只是没有尝试足够的时间。

正在制定的意图代码:

在 C2DM 接收器服务中:

在 LoginPage(Activity A)中,登录成功后:

有关活动堆栈结构的更多详细信息,请参见图片:

http://i89.photobucket.com/albums/k207/cephron/ActivityStack.png

这是千言万语:

Activity A 是一个登录页面;登录成功后,启动B。B是一个TabActivity,其中包含三个Activity(由C、D、E表示)。C、D 和 E 中的每一个实际上都是一个 ActivityGroup,其子活动模仿活动的通常堆栈行为。

因此,每个选项卡都包含自己的活动堆栈,并且在选项卡之间切换会更改当前正在由用户导航推送到/弹出哪些堆栈(每个选项卡都包含一个 ListActivities 堆栈,通过实体的层次结构浏览)。这些也可以在巨大的“B”TabActivity(由 X 表示)之外启动新的活动。

因此,从 Activity A 登录后,在接受更多用户输入之前,至少会创建三个 Activity: -B 已创建(并且可以看到,因为 TabWidget 现在位于屏幕顶部) -其中一个 ActivityGroups 已创建:无论哪个属于默认选项卡。这个 ActivityGroup 在屏幕上仍然没有显示,但是......它只显示其子活动堆栈的顶部活动。- 所以,最后,创建了 ActivityGroup 堆栈的“根”活动(在图片中,F 是此类 Activity 的示例)。此活动显示在 TabWidget 下方。

在每个选项卡被访问一次后,不再通过在选项卡之间切换来创建/销毁活动(不计算内存杀死)。在任何选项卡finish() 中按回该堆栈顶部的活动,显示其下方的活动。在任何选项卡中从根活动(如 F)按回完成整个 TabActivity,将用户送回 A。

传递给 B 的意图还指示它自动导航到与默认选项卡不同的选项卡。在我们最终得到一堆 [A -> B -> B] 的情况下,第一个 B 被导航到正确的选项卡,第二个是默认的。

0 投票
1 回答
156 浏览

android - 从其他应用程序启动 Activity 的问题

我遇到了一个问题,希望你能提供一些建议。

这是问题所在:

我的应用程序中有一个AActivity,它是应用程序的MAINActivity,可以从其他应用程序(如 SMS)启动。现在考虑我的应用程序任务中有A-B-C-D活动,正如我之前所说,用户可以从短信启动A活动,当从短信A启动时,我希望B C D一切都完成,任务中的活动实例A将被带到前面。

我尝试将A活动设置launchModesingleTask,这可以解决问题,但还有另一个问题:例如,我A-B-C-D在应用程序的任务中获得了活动,用户按下HOME主屏幕的键,然后从启动器重新启动应用程序,然后A活动显示而不是D活动。就像应用程序从头开始一样,这不是我想要的。

有什么办法可以做到这一点吗?任何建议将不胜感激。提前致谢!

0 投票
2 回答
1782 浏览

android - 如何从 singleInstance 活动开始活动?

我有一个小部件,单击时可以弹出小对话框。这些对话框由 singleInstance launchMode 中名为 RemoteActivity 的活动显示。在其中一个对话框中,有一个用于启动主应用程序 MainActivity 的按钮,该应用程序具有标准的启动模式。

但是,当单击此按钮并调用 startActivity() 时,MainActivity 不会启动,尽管我可以在 logcat 中看到相应的“Starting activity: Intent { ... }”。

如果我将 RemoteActivity 的 launchMode 设置为标准,则 MainActivity 会启动,但这不是我想要的,RemoteActivity 只是小部件的扩展,我不希望它与任何其他活动堆叠。

我也尝试过使用 FLAG_ACTIVITY_NEW_TASK 但它没有帮助,而且根据文档,它不应该是必需的:

另一方面,“singleInstance”活动不允许其他活动成为其任务的一部分。这是任务中的唯一活动。如果它启动另一个活动,则该活动被分配给不同的任务——就好像 FLAG_ACTIVITY_NEW_TASK 在意图中一样。

如何启动我的主要活动?

更新/勘误表:

MainActivity 实际上是启动的,但前提是它还不是任务的一部分。如果我通过启动器正常启动 MainActivity,然后按 Back 退出,那么 RemoteActivity 会启动 MainActivity。

但是,如果我没有按 Back,而是按 Home 离开 MainActivity,那么 RemoteActivity 将无法启动 MainActivity,尽管意图出现在 logcat 中。

我正在 Froyo 上对此进行测试。

知道发生了什么吗?

0 投票
2 回答
1275 浏览

android - Android:launchMode =“singleTask”的安全异常

我已将我的活动的启动模式声明为 singleTask。如果我启动我的应用程序,按主页按钮,转到电子邮件客户端(在这种情况下为 gmail)并使用我的应用程序预览附件,我在 Android 2.3 及更高版本上遇到安全异常,这表明我没有访问 gmail 附件的权限。如果我不使用 singleTask 作为启动模式,则以前的版本不会发生异常。

异常发生在这一行 -

其中 mContext 是活动上下文。

这是一个已知的问题?

任何帮助将不胜感激。

谢谢,

阿克谢

0 投票
3 回答
7640 浏览

java - Android:launchMode=SingleTask 问题

我有一个围绕主要活动(主菜单)的应用程序。在每个其他应用程序中,都有一个指向此活动的选项菜单项。

起初,我总是在选择该项目时开始一个新的主要活动。使用意图包,我确实告诉主要活动我在重新开始时所做的一些初始化是不必要的。

但是,我不太喜欢整体行为。我偶然发现android:launchMode="SingleTask"这似乎有所帮助:现在我不会一直重新创建我的主菜单活动;另外,如果我按下“返回”按钮,我会直接返回主屏幕。这感觉就像一个适当的“主”菜单。

我现在的问题是:如果我运行我的应用程序的另一个活动,按主页按钮然后重新打开我的应用程序(例如使用“最后一个应用程序”),那么我不会回到最后一个活动,而是回到主要活动。另一个活动被破坏。

有什么想法可以在SingleTask不返回一项活动的情况下实现的行为吗?

0 投票
3 回答
792 浏览

android - 使用 singleTask 时如何处理每个 Intent

我正在使用单任务模式活动,该活动通过指定意图过滤器来处理某种类型的文件。我需要只处理每个这样的文件 Intent 一次。问题是 onNewIntent() 仅在任务已经存在时才被调用,这迫使我也处理来自 onCreate() 的意图。不幸的是,onCreate() 被调用的原因有很多(例如屏幕旋转),而 getIntent() 返回的 Intent 可能在多个 onCreate() 中是相同的。当然,可以使用一些丑陋的 hack 来解决这个问题,但我想知道优雅的解决方案是什么。到目前为止,我想出的最佳解决方案是每次处理意图后 setIntent(new Intent(Intent.ACTION_MAIN)) 。

谢谢!

0 投票
1 回答
1036 浏览

android - 如何恢复跑步活动?

我给自己做了一个应用程序:一个带有自动书签的音乐播放器 :)

问题:

如果我“返回”到主页然后尝试再次运行应用程序,它会创建一个新实例,而我想继续。我可能会在做其他事情时让音乐继续播放,然后我无法暂停或保存它,因为我无法访问它!

失败的解决方案:

我试过singleTop、singleTask、singleInstance,但它们都不起作用!

我可以查看正在运行的应用程序(设置 > 应用程序 > 管理应用程序 > 运行),但它只能让您“强制停止”它们。“上前”怎么样?!此外,当我完成()我的应用程序时,我注意到它仍在“运行”!

这个网站非常棒且有用,这是我的第一个问题 :) 我寻找答案,但找不到任何有效的答案 :(

这是清单:

0 投票
1 回答
506 浏览

android - 如何让第二个启动器始终在指定活动中打开应用程序

在我的应用程序中,我指定了可以从启动器启动的第二个活动,使用此清单条目:

假设我在“主要”活动中打开了应用程序,然后按主页键。我的应用程序仍将运行,但在后台。

稍后,用户从主屏幕中选择“ListsOfListsActivity”的启动器图标。

这会将应用程序带到前台,但不是在“ListOfListsActivity”,而是在它进入后台时的当前活动(例如在“主”活动)。

这很令人困惑,因为用户选择了“ListOfListsActivity”,但显示的是另一个。然后他们必须导航到它。

通过为“ListOfListsActivity”指定launchMode =“singleTask”,我让这个工作更好,但在这种模式下,它不能从另一个活动启动以获得结果(startActivityForResult()),我需要能够这样做才能选择一个列表...

问题:-无论应用程序的当前状态和当前活动如何,如何指定将强制活动到前台并成为选定活动的意图过滤器?