侧边栏壁纸
博主头像
Eoser's page! 博主等级

@学习@生活@自己

  • 累计撰写 114 篇文章
  • 累计创建 29 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Android singleTask 和 setActivityResoult

eoser
2023-03-23 / 0 评论 / 0 点赞 / 0 阅读 / 0 字

Ativity启动的4种模式standard、singleTop、singleTask、singleINstance)

使用方法


    
        
        ......
  • standard(标准的启动模式) 系统默认情况下就是这个模式,会启动一个新的Activity
  • singleTop (栈顶复用模式) 如果要启动的Activity已经处于栈的顶部,系统将不会创建新的实例,而是直接打开此页面,onNewIntent()方法将会执行,onCreate()和onStart()方法不会调用。
  • singleTask(栈内复用模式)
    1. 如果栈中存在这个Activity就会复用这个Activity,复用时,会将它上面的Activity全部出栈,并且会回调该实例的onNewIntent()方法。 这个过程还存在一个任务栈的匹配,因为这个模式启动时,会在自己需要的任务栈中寻找实例,这个任务栈就是通过taskAffinity属性指定。如果这个任务栈不存在,则会创建这个任务栈。不设置taskAffinity属性的话,默认为应用的包名。
    2. 在复用的时候,首先会根据taskAffinity去找对应的任务栈: 2.1 如果不存在指定的任务栈,系统会新建对应的任务栈,并新建Activity实例压入栈中。 2.2 如果存在指定的任务栈,则会查找该任务栈中是否存在该Activity实例 a. 如果不存在该实例,则会在该任务栈中新建Activity实例。 b. 如果存在该实例,则会直接引用,并且回调该实例的onNewIntent()方法。并且任务栈中该实例之上的Activity会被全部销毁。

  • singleInstance(单实例模式)
    1. 启动该模式Activity的时候,会查找系统中是否存在: 1.1 不存在,首先会新建一个任务栈,其次创建该Activity实例。 1.2 存在,则会直接引用该实例,并且回调onNewIntent()方法。 1.3 特殊情况:该任务栈或该实例被销毁,系统会重新创建。
    2. 具备singleTask模式的所有特性外,与它的区别就是,这种模式下的Activity会单独占用一个Task栈,具有全局唯一性,即整个系统中就这么一个实例,由于栈内复用的特性,后续的请求均不会创建新的Activity实例,除非这个特殊的任务栈被销毁了。 手机上的快应用和微信小程序就是使用的这个方法,创建单独的栈。

情景模拟

  1. startActivityForResoult() 与 singleTask 一起使用的基本情况 Activity栈: A standard B singleTask C standard C startActivityForResoult 启动B,B直接调用C的onActivityResult,返会取消码0,销毁C。

  2. 遇到的情况 Activity栈: A standard B singleTask C standard A startActivityForResoult B,B startActivity,C startActivity B 后finish

    按道理应该只有一个B,但是C startActivity 却创建了一个新的B
    

    待验证猜测: 根据taskAffinity的值为"",singleTask只能在一个栈里有一个,通过startActivityForResult来传递值必须在一个栈里,怀疑startActivityForResult开启的B时,会忽略taskAffinity的值,B启动的栈和C startActivity 的栈不是同一个。

0

评论区