美文网首页安卓
LaunchMode应用场景&onNewIntent的调用时机

LaunchMode应用场景&onNewIntent的调用时机

作者: 千夜零一 | 来源:发表于2021-05-31 16:42 被阅读0次

    LaunchMode类型及其应用场景

    • standard,创建一个新的Activity。

    • singleTop,栈顶不是该类型的Activity,创建一个新的Activity。否则,onNewIntent。

    • singleTask,回退栈中没有该类型的Activity,创建Activity,否则,onNewIntent+ClearTop。

    注意
    设置了"singleTask"启动模式的Activity,它在启动的时候,会先在系统中查找属性值affinity等于它的属性值taskAffinity的Task存在;如果存在这样的Task,它就会在这个Task中启动,否则就会在新的任务栈中启动。因此, 如果我们想要设置了"singleTask"启动模式的Activity在新的任务中启动,就要为它设置一个独立的taskAffinity属性值。

    如果设置了"singleTask"启动模式的Activity不是在新的任务中启动时,它会在已有的任务中查看是否已经存在相应的Activity实例, 如果存在,就会把位于这个Activity实例上面的Activity全部结束掉,即最终这个Activity 实例会位于任务的Stack顶端中。

    在一个任务栈中只有一个”singleTask”启动模式的Activity存在。他的上面可以有其他的Activity。这点与singleInstance是有区别的。

    • singleInstance,回退栈中,只有这一个Activity,没有其他Activity。

    singleTop适合接收通知启动的内容显示页面。

    例如,某个新闻客户端的新闻内容页面,如果收到10个新闻推送,每次都打开一个新闻内容页面是很烦人的。

    singleTask应用场景:适合作为程序入口点。

    例如浏览器的主界面。不管从多少个应用启动浏览器,只会启动主界面一次,其余情况都会走onNewIntent,并且会清空主界面上面的其他页面。

    singleInstance应用场景

    闹铃的响铃界面。 你以前设置了一个闹铃:上午6点。在上午5点58分,你启动了闹铃设置界面,并按 Home 键回桌面;在上午5点59分时,你在微信和朋友聊天;在6点时,闹铃响了,并且弹出了一个对话框形式的 Activity(名为 AlarmAlertActivity) 提示你到6点了(这个 Activity 就是以 SingleInstance 加载模式打开的),你按返回键,回到的是微信的聊天界面,这是因为 AlarmAlertActivity 所在的 Task 的栈只有他一个元素, 因此退出之后这个 Task 的栈空了。如果是以 SingleTask 打开 AlarmAlertActivity,那么当闹铃响了的时候,按返回键应该进入闹铃设置界面。


    onNewIntent的调用时机

    1、该Activity之前已经创建过,也就是执行过了onCreate方法,处于当前应用的任务栈中;

    2、该Activity被二次启动,不再调用onCreate方法,而是调用onNewIntent方法;

    3、该Activity的LaunchMode不被设置为Standard模式。

    更准确的来说,只对SingleTop(且位于栈顶),SingleTask和SingleInstance(且已经在任务栈中存在实例)的情况下,再次启动它们时才会调用,即只对startActivity有效,对仅仅从后台切换到前台而不再次启动的情形,不会触发onNewIntent

    该Activity的生命周期变化情况如下:
    • (1)LaunchMode为Standard时:

    由于每次启动ActivityA都是启动新的实例,和原来启动的没关系,所以不会调用原来ActivityA的onNewIntent方法

    • (2)LaunchMode为SingleTop时:Main -> A -> A

    如果ActivityA在栈顶,且现在要再启动ActivityA,这时会调用onNewIntent()方法 ,生命周期顺序为:

    onCreate--->onStart--->onResume---onPause---自己跳自己--->onNewIntent--->onResume

    • (3)LaunchMode为SingleInstance/SingleTask时:

    跳转顺序:Main -> A -> B ->A,其中A的LaunchMode被指定。

    onCreate--->onStart--->onResume---onPause---跳转B---onStop--->跳转A(自己)--->onRestart--->onStart--->onNewIntent--->onResume

    Tips:。activity再启动他的话,他拿到的是之前的那个activity实例,所以说在onnewintent里面只需要处理数据部分。不需要处理布局,界面渲染之前的activity已经做过了。

    相关文章

      网友评论

        本文标题:LaunchMode应用场景&onNewIntent的调用时机

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