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)
有可能做我想要的吗?
提前致谢
你说
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的ImportActivity
linux进程中执行,并且将在另一个具有另一个用户ID的linux进程中执行.但是,它们都可以构成一个任务的一部分,只有一个后栈.
ImportActivity
作为gmail任务的一部分,将执行与在独立应用程序中执行时相同的有效Linux用户ID - 并且与gmail执行的Linux用户ID不同.这听起来不太可能和复杂,但似乎隐含在https://developer.android.com/guide/components/fundamentals.html.那讲得通; 如果ImportActivity
需要了解为您的应用程序存储的用户首选项,则需要读取首选项文件,就好像它是为您的应用程序定义的用户,而不是为gmail定义的用户.
我还没有尝试执行任何此操作.如果我完全握住了杆的错误结束,我相信有人会很快告诉我们!
我真的不确定我是否得到它,但如果你想进入你的“根”活动而不丢失额外的应用程序堆栈,它将直接Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP
在你的标志上intent
,并且没有额外的配置Manifest
......并且如果你需要分离任务来创建一个新的完整的新堆栈,而不是您可以Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP
按照您所描述的方式使用。
归档时间: |
|
查看次数: |
3173 次 |
最近记录: |