美文网首页
Activity的Launchmode

Activity的Launchmode

作者: HoooChan | 来源:发表于2017-11-27 15:50 被阅读8次

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

    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中还有其他条件的限制。

    • 设置了singleTask和taskAffinity
      • 如果存在这样的一个任务,则检查在这个任务中是否已经有了一个SecondActivity的实例;
        • 如果已经存在一个SecondActivity的实例,则会重用这个任务和任务中的SecondActivity实例,将这个任务调到前台,清除位于SecondActivity上面的所有Activity,显示SecondActivity,并调用SecondActivity的onNewIntent();
        • 如果不存在一个SecondActivity的实例,会在这个任务中创建SecondActivity的实例,并调用onCreate()方法;
      • 如果不存在这样的一个任务,会创建一个新的affinity为com.jg.zhang.androidtasktest.second的任务,并且将SecondActivity启动到这个新的任务中。

    singleInstance的使用场景:

    呼叫来电页面。

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

    相关文章

      网友评论

          本文标题:Activity的Launchmode

          本文链接:https://www.haomeiwen.com/subject/odjdbxtx.html