首先需先清楚android中四大启动方式:
- standard
- singleTop
- singleTask
- singleInstance
网上一大堆介绍的,不再赘述了。
然后贴两个帖子:
android中activity的四种加载模式
android:launchMode设置成singleTask时的一个问题
Activity启动模式singleTask,singleInstance研究
然后,下面是我自己的总结:(半拿半总结)
关于SingleTask模式:
1.一个项目中的android.intent.action.MAIN 的Activity不要设置为singleTask模式,否则,当ActivityA --> ActivityB此时比如来了一个电话,按了Home键,接完电话然后重新点击此程序图标将又重新从ActiivtyA开始执行,原因是:
“
第一个是singletask也就是启动第一个actvity的时候会放置放置到一个新的task下,当你再启动其他activity时第一个 activity就在栈的底部,当你再次进入程序时他会查看是否有其他任务的栈里含有这个singletask的activity如果它在底部那么就将在他上面的都finish掉,所以再回去总是第一个界面。
” android:launchMode设置成singleTask时的一个问题第22楼说的
2.如果想要从ActivityX中setResult返回结果,那么此Actiivty不能设置为SingleTask模式,否则将无法收到intent信息,原因参照Activity启动模式singleTask,singleInstance研究
3.如果ActivityA设置为singleInstance模式,那么不管ActivityB有没有设置为singleTask,从ActivityA中startActivityForResult到ActivityB中,都无法获得结果,原因是
“
singleInstance要求activity的实例不仅只有一个,并且整个task中只有一个activity实例,而singleTask所在的栈中允许存在其他activity的实例
”(来源Activity启动模式singleTask,singleInstance研究)
4.假设场景启动应用程序顺序是ActivityA --> ActivityB --> ActivityC,而要求如果在ActivityC中按Home键,然后重新进来,启动顺序是ActivityA --> ActivityC,这个ActivityC不确定指的是按Home键的Activity,怎么办?一定要在每次唤醒之后先启动ActivityB,咋办?
解决办法是:对ActivityA设置为SingleInstance模式,然后再在应用中增加一个中间Activity,假设为MiddleActivity,在其onCreate()方法中直接finish(),然后在ActivityA中增加一个变量boolean mIsFirstLaunch = true;当第一次跳转ActivityB的时候设其为false,当再次启动的时候检测mIsFirstLaunch 是否为false,为false就进入MiddleActivity,而MiddleActivity又直接finish()了,就又回到ActiivtyC了
个中缘由:ActivityA为SingleInstance模式,即在一个单独的Task中且只有它一个Activity,而其他activity都在另一个task中,当按H键的时候ActivityC在此task中的栈顶,但是相隔两个task中,而且又不确定应该从ActivityA中启动哪个activity,所以直接以MiddleActivity为跳板,回到栈顶,然后finish(),自然就回到ACtivityC了。
很easy的一个问题,关键是思路。