手机页面显示的就是前台任务栈中的栈顶元素。
Task是可以跨应用的,这正是Task存在的一个重要原因。有的Activity,虽然不在同一个app中,但为了保持用户操作的连贯性,把他们放在同一个Task中。例如,在我们的应用中的一个Activity A中点击发送邮件,会启动邮件程序的一个Activity B来发送邮件,这两个activity是存在于不同app中的,但是被系统放在一个任务中,这样当发送完邮件后,用户按back键返回,可以返回到原来的Activity A中,这样就确保了用户体验。
一般来说,从Activity A
跳转到Activity B
,都会新建一个Activity B
,然后调用Activity B
的:
onCreate() -> onStart() -> onResume()
SingleTask
但是如果Activity B
设置了singleTask,而且跳转顺序为Activity B -> Activity A -> Activity B
,这时候就不会新建一个Activity B
实例了,而是把后台的Activity B
转到前台,Activity B
上面的Activity都会被清除,接着调用:
onNewIntent() -> onRestart() -> onStart() -> onResume()。
但是Activity随时有可能被回收,如果被回收了再跳回就又是onCreate()了。所以要在onCreate()和onNewIntance()对intent中的数据进行相同的处理,而且还要在onNewIntent()中setIntent(intent),不然会得不到正确的intent。
SingleTop
如果某个Activity A
设置了singleTop,跳转顺序为Activity A -> Activity A
,Activity A
本身就在栈顶, 这个时候不会进行跳转,但会调用onNewIntent()函数。
SingleInstance
singleInstance表示该Activity的任务栈只能包含它一个Activity。
使用场景
singleTop的使用场景:
通知栏弹出Notification,点击Notification跳转到指定Activity,但是如果我现在页面就停留在那个指定的Activity,这个时候就不需要新建Activity了。
另外还有登陆,登陆完成后跳转到另一个Activity,如果点击了多次登陆按钮,就有可能生成多个跳转页面,当设置为singletop可以避免这个问题。
singleTask的使用场:
可以用作应用最外层的页面,在该页面只要按返回键就会退出应用。又或者当前应用已经启动,其他应用调用这个页面,进行各种跳转,最后还是从这个页面返回到原来的应用,而不是在此应用进行返回。设置singleTask的Activity可以指定所在的任务栈。
singleTask模式只意味着“可以在一个新的任务中开启”,至于是不是真的会在新任务中开启,在framework中还有其他条件的限制。
-
设置了singleTask和taskAffinity
- 如果存在这样的一个任务,则检查在这个任务中是否已经有了一个SecondActivity的实例;
- 如果已经存在一个SecondActivity的实例,则会重用这个任务和任务中的SecondActivity实例,将这个任务调到前台,清除位于SecondActivity上面的所有Activity,显示SecondActivity,并调用SecondActivity的onNewIntent();
- 如果不存在一个SecondActivity的实例,会在这个任务中创建SecondActivity的实例,并调用onCreate()方法;
- 如果不存在这样的一个任务,会创建一个新的affinity为com.jg.zhang.androidtasktest.second的任务,并且将SecondActivity启动到这个新的任务中。
- 如果存在这样的一个任务,则检查在这个任务中是否已经有了一个SecondActivity的实例;
singleInstance的使用场景:
呼叫来电页面。
- 以singleInstance模式启动的Activity具有全局唯一性,即整个系统中只会存在一个这样的实例。
- 以singleInstance模式启动的Activity在整个系统中是单例的,如果在启动这样的Activiyt时,已经存在了一个实例,那么会把它所在的任务调度到前台,重用这个实例。
- 以singleInstance模式启动的Activity具有独占性,即它会独自占用一个任务,被他开启的任何activity都会运行在其他任务中。
- 被singleInstance模式的Activity开启的其他activity,能够在新的任务中启动,但不一定开启新的任务,也可能在已有的一个任务中开启。
taskAffinity可以指定Activity所在的栈。设置了taskAffinity的Activity启动时,会先看是否有目标栈已存在,如果存在则直接宿主到该栈中,没有的话再新建。这个属性在singleTop下不起作用。
网友评论