有一个活动实例

时间:2012-12-12 19:29:38

标签: android android-intent android-activity android-lifecycle

我的活动导航和后台堆有问题,我希望你能为我清理它。

问题

Root活动>>> SecondActivity>> HomeButton

然后我转到主页,然后从那里选择......

Gmail>>消息>>在我的应用程序中打开附件>> ImportActivity>> RootActivity

结果是正在启动的新任务以及正在使用我的应用程序的另一个实例。这是不可接受的,因为我不想运行两个单独的任务我只想要一个。

期望的结果

我想要发生的是当用户打开附件并且 ImportActivity 完成其操作(它已将android:noHistory设置为true)并调用startActivity(intent),{{ 1}}已启动,但在原始任务中仅保留一个实例和其余活动(在本例中为RootActivity)将被删除。

我想要这个的原因是,如果用户在导入文件后导航出我的应用程序,然后触摸应用程序图标,则会加载第一个任务及其后端堆栈,并且我有两个任务正在运行,其中用户可以在两个我的应用程序的不同部分一次。

我尝试了什么

我玩过启动模式,但没有一个真正给我提供我需要的功能。

启动模式我试过..

android:launchMode =“singleTask” - 这只是每次启动时再次启动根活动。即使用户按下我的应用程序内的主页按钮并触摸了应用程序图标,也会破坏后面的堆栈。

android:launchMode =“singleInstance =不允许在任务中运行任何其他活动。

同样在调用启动SecondActivity的意图时,我使用了以下内容无效。

RootActivity

有可能做我想做的事吗?

提前致谢

3 个答案:

答案 0 :(得分:5)

你说

Gmail >> Message >> Open attachment in my application >> ImportActivity >> RootActivity

但这可能不对。在这种情况下,gmail会针对您应用中的Intent发出ImportActivityImportActivity将执行。但是,我对https://developer.android.com/guide/components/tasks-and-back-stack.html的阅读表明,ImportActivity将作为gmail执行相同任务的一部分执行,并将放在gmail任务的后台堆栈之上,除非您在清单中执行特殊步骤防止它或gmail专门调用它作为一个单独的任务。当ImportActivity完成时,它不应该调用startActivity(intentForRootActivity),而应该只调用finish()以便它将被销毁,并且将显示来自后面堆栈中位于其下方的gmail的活动。

如果ImportActivity调用了startActivity(intentForRootActivity),那么RootActivity就会进入gmail任务的顶部并显示在gmail后台堆栈上。触摸home然后点击Gmail的启动器图标会再次显示RootActivity,隐藏gmail。

我认为您需要android:launchMode="standard"的清单声明中的ImportActivity

不会修改代表您应用的旧版独立实例的任务。如果有人触摸了您应用的启动器图标,您的应用的旧状态将会恢复,不受gmail任务中发生的任何事情的影响。

文档http://developer.android.com/guide/components/processes-and-threads.html对于活动如何映射到流程(使David Wasser评论我的早期版本的答案)相当模糊,但似乎gmail的活动将在一个linux进程中执行,其中一个linux用户ID和ImportActivity将在另一个具有另一个用户ID的linux进程中执行。但是,它们都可以构成一个任务的一部分,只有一个后栈。

作为gmail任务的一部分,

ImportActivity将执行与在独立应用程序中执行时相同的有效Linux用户ID - 并且与gmail执行的Linux用户ID不同。这听起来不太可能和复杂,但https://developer.android.com/guide/components/fundamentals.html似乎暗示了这一点。那讲得通;如果ImportActivity需要获取为您的应用程序存储的用户首选项,则需要读取首选项文件,就好像它是为您的应用程序定义的用户,而不是为gmail定义的用户。

我没有尝试执行任何此操作。如果我完全掌握了杆的错误结束,我相信有人会很快告诉我们的!

答案 1 :(得分:1)

您不需要任何特殊launchMode来执行此操作。如果您的导入活动使用Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP启动根活动,则应该执行您想要的操作。我猜你有taskAffinity的问题。试试这个:

在您的清单中,在importActivity的声明中添加以下内容:

android:taskAffinity=""

如果这不起作用,请发布您的清单,以便我们查看。

答案 2 :(得分:0)

我真的不确定我是否得到了它,但是如果你想在没有额外的应用程序堆栈的情况下进入你的“root”活动,那么Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP就会intent指向你Manifest的标记,并且Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP上没有额外的配置...如果您需要将任务分开以创建新的完整新堆栈,而不是如您所述使用{{1}}。