有一个活动实例

Stu*_*ing 21 android android-intent android-lifecycle android-activity

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

问题

根活动>>> SecondActivity >> HomeButton

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

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

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

期望的结果

我想要发生的是当用户打开附件并且ImportActivity完成它正在做的事情(它已android:noHistory设置为true)和调用时startActivity(intent),RootActivity启动,但在原始任务中只保留一个实例和其余的活动(在这种情况下SecondActivity)被删除.

我想要这个的原因是,如果用户在导入文件后导航出我的应用程序,然后触摸应用程序图标,它会加载第一个任务及其后台堆栈,我有两个任务在运行,其中用户可以在两个不同的部分我的申请立刻.

我试过了什么

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

启动模式我试过..

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

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

此外,当调用意图启动时,RootActivity我使用以下内容无济于事.

Intent i = new Intent(ImportActivity.this,TrackingActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);
Run Code Online (Sandbox Code Playgroud)

有可能做我想要的吗?

提前致谢

emr*_*s57 5

你说

Gmail >> Message >> Open attachment in my application >> ImportActivity >> RootActivity
Run Code Online (Sandbox Code Playgroud)

但这可能不对.在这种情况下,gmail会在您的应用中发出Intent针对性的内容ImportActivity.ImportActivity将执行.但是,我对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用户ID的ImportActivitylinux进程中执行,并且将在另一个具有另一个用户ID的linux进程中执行.但是,它们都可以构成一个任务的一部分,只有一个后栈.

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

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


Poz*_*pps 0

我真的不确定我是否得到它,但如果你想进入你的“根”活动而不丢失额外的应用程序堆栈,它将直接Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP在你的标志上intent,并且没有额外的配置Manifest......并且如果你需要分离任务来创建一个新的完整的新堆栈,而不是您可以Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP按照您所描述的方式使用。