Activity的Launchmode

2017-11-27  本文已影响8人  HoooChan

手机页面显示的就是前台任务栈中的栈顶元素。

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 AActivity A本身就在栈顶, 这个时候不会进行跳转,但会调用onNewIntent()函数。

SingleInstance

singleInstance表示该Activity的任务栈只能包含它一个Activity。


使用场景

singleTop的使用场景:

通知栏弹出Notification,点击Notification跳转到指定Activity,但是如果我现在页面就停留在那个指定的Activity,这个时候就不需要新建Activity了。
另外还有登陆,登陆完成后跳转到另一个Activity,如果点击了多次登陆按钮,就有可能生成多个跳转页面,当设置为singletop可以避免这个问题。

singleTask的使用场:

可以用作应用最外层的页面,在该页面只要按返回键就会退出应用。又或者当前应用已经启动,其他应用调用这个页面,进行各种跳转,最后还是从这个页面返回到原来的应用,而不是在此应用进行返回。设置singleTask的Activity可以指定所在的任务栈。

singleTask模式只意味着“可以在一个新的任务中开启”,至于是不是真的会在新任务中开启,在framework中还有其他条件的限制。

singleInstance的使用场景:

呼叫来电页面。

  1. 以singleInstance模式启动的Activity具有全局唯一性,即整个系统中只会存在一个这样的实例。
  2. 以singleInstance模式启动的Activity在整个系统中是单例的,如果在启动这样的Activiyt时,已经存在了一个实例,那么会把它所在的任务调度到前台,重用这个实例。
  3. 以singleInstance模式启动的Activity具有独占性,即它会独自占用一个任务,被他开启的任何activity都会运行在其他任务中。
  4. 被singleInstance模式的Activity开启的其他activity,能够在新的任务中启动,但不一定开启新的任务,也可能在已有的一个任务中开启。
    taskAffinity可以指定Activity所在的栈。设置了taskAffinity的Activity启动时,会先看是否有目标栈已存在,如果存在则直接宿主到该栈中,没有的话再新建。这个属性在singleTop下不起作用。
上一篇 下一篇

猜你喜欢

热点阅读