• 对Activity启动模式的理解


    对Activity启动模式的理解

    • 应用场景
      • 在已打开多个Activity应用B的前提下,应用A调用应用B后点击返回按钮,需要直接返回到A应用,而不是打开B应用的上一个Activity

    一个Task可以理解为一个Activity栈,可以装载一个或多个Activity,回退和打开的顺序逻辑和基本的数据结构栈是一致的。

    一个Application如果有N个Activity,这些Activity分布在M个任务栈中,那么Application的回退栈会遵循这样的原则:

    1. 首先从当前Activity在的Task回退,直到这个Task中再无记录
    2. 寻找下一个Task再次退回直到没有Activity
    3. 这个Task是在Application的总栈中有记载的,总是Task中最近使用的Activity相关

    对SingleTask的理解

    1. 该启动模式建议和TaskAffinity一起使用,这样才能发挥这种加载模式的特殊逻辑效果。
    2. 当一个应用程序加载一个singleTask模式的Activity时,首先该Activity会检查是否存在与它的taskAffinity相同的Task。
      • 如果存在,那么检查是否实例化,如果已经实例化,那么销毁在Activity以上的Activity并调用onNewIntent。如果没有实例化,那么该Activity实例化并入栈
      • 如果不存在,那么就重新创建Task,并入栈

    对SingleInstance的理解

    1. 当一个应用程序加载一个singleInstance模式的Activity时,如果该Activity没有被实例化,那么就重新创建一个Task,并入栈。如果已经被实例化,那么就调用该Activity的onNewIntent
    2. singleInstance的Activity所在的Task不允许存在其他Activity,任何从该Activity加载的其他Activity(比如Activity2)都会被放入其他的Task中,如果存在与Activity2相同的affinity的Task,则在该Task内创建Activity2.如果不存在,则重新生成新的Task并入栈

    以上这些学习都是因为最近在做一个微信调起客户端的事情。如果自己的客户端处于运行状态,按下Home键后台挂起。此时如果使用微信调起自己的客户端某个页面,不做任何处理的情况下,按下回退或者当前Activity.finish(),页面都会停留在自己的客户端(因为自己的Application回退栈不为空),这明显不符合逻辑的。产品的要求是,回退必须回到微信客户端,而且要保证不杀死自己的Application.我的处理方案就是,设置当前被调起Activity的属性为:

    LaunchMode=""SingleTask"

    taskAffinity="com.tencent.mm"(com.tencent.mm是借助于工具找到的微信包名),就是把自己的Activity放到微信默认的Task栈里面,这样回退时就会遵循“Task只要有Activity一定从本Task剩余Activity回退"的原则,不会回到自己的客户端;而且也不会影响自己客户端本来的Activity和Task逻辑。

    学习资料

    1. Android中Activity四种启动模式和taskAffinity属性详解
  • 相关阅读:
    【原】手写梯度下降《三》之
    【原】特征/SVD分解(图像压缩)/PCA降维简介
    【原】手写梯度下降《二》之
    【原】手写梯度下降《一》之
    Python守护进程和脚本单例运行
    subprocess popen 子进程退出的问题
    subprocess.Popen 详解
    python可以序列化的对象
    concurrent.futures的一些经验
    详解multiprocessing多进程-Pool进程池模块
  • 原文地址:https://www.cnblogs.com/coderwjq/p/6667386.html
Copyright © 2020-2023  润新知