• android 四种模式研究之一


      最近一直在被activity之间传值问题所纠结,然后我所要求是不是简单的传值,它们包括应用间的传值与应用内的传值,并且加上了activity的加载模式,这个就有点不一样了。那今天就以android里activity的四种加载模式为话题说说吧。

      总所周知,activity有四种加载模式:standard,singleTop,singleTask,singleInstance。standard模式也就是标准模式,是activity默认的模式,这个比较简单,就不讲。下面主要就说说其它三种。

       singleTop

      我觉得学习它得跟standard一起。他们唯一的却别就是,当一个启动目标为singleTop模式的activity已经有实例在当前Task栈顶的时候,activity不会重新实例化,而是使用在Task栈顶的那个activity(具体的过程:onResume->onNewIntent->onResume).

      测试(由于情况太多,代码却简单,代码就不贴了,都是直接打log的事情):

      第一种情况:应用里调用

      A(main+launcher),B(singleTop) : A->B--startActivity-->B   同个Task,不重新生成一个B的实例

      A(main+launcher),B(singleTop) : A->B--startActivityForResult-->B   同个Task, 会重新生成一个B的实例 

      第二种情况:应用间调用

      A1(main+launcher),A2(main+launcher+singleTop) : A1->A2--startActivity-->A2   同个Task,不重新生成一个A2的实例  

      A1(main+launcher),A2(main+launcher+singleTop) : A1->A2--startActivity-->A2   同个Task,会重新生成一个A2的实例

      看来,SingleTop模式似乎与启动方式有关,与是否是应用间调用没有关系:当以startActivityForResult方式启动时候,跟standard模式一模一样。

      singleTask

      它跟后面说的singleInstance一起学。他们的唯一却别就是:singleInstance模式的activity且只能存在一个单独的Task,且这个Task之鞥有且仅有它本身一个activity;而singleTask没有这个要求(即含有singleTask-activity的Task可以含有很多activity)。singleTask意思就是说:这个activity只能有一个实例,只能存在一个Task。官方上说:The system creates a new task and instantiates the activity at the root of the new task. However, if an instance of the activity already exists in a separate task, the system routes the intent to the existing instance through a call to its onNewIntent() method, rather than creating a new instance. Only one instance of the activity can exist at a time.  Although the activity starts in a new task, the BACK key still returns the user to the previous activity.我感觉没有说清楚,我们暂且不管,先测试:

      第一种情况:应用里调用

      A(main+launcher),B(singleTask),C : A-startActivity->B->startActivityForResult->C-startActivity->B   同个Task,不会重新生成B实例,C销毁。

      A(main+launcher),B(singleTask),C : A-startActivityForResult->B-startActivityForResult->C-startActivityForResult->B   同个Task,不会重新生成B实例,C销毁。第1、3个startActivityForResult无法返回数据

      数据如下:图片中的数据均是主界面TaskActivity开始截图的,上为

      第二种情况:应用间调用

      A1(main+launcher),A2(main+launcher+singleTask) : A1-startActivity->A2-startActivity->A2   不同Task,不会重新生成A2

      A1(main+launcher),A2(main+launcher+singleTask) : A1-startActivityForResult->A2-startActivityForResult->A2 不同Task,不会重新生成A2,第1,2个startActivityForResult失效

      看来,应用里调用singleTask模式的activity时候,不会产生新的Task,而应用间调用singleTask模式的activity时候,会产生新的Task。另外startActivityForResult函数对启动singleTask模式的activity会失效。另外,当重用前面的singleTask模式的activity时,该Task栈中间的activity会被销毁。

      singleInstance

      上面说了,这里就不讲了。测试结果就是:除了在应用里调用时为都不同Task,其它的都一样。

      注意:“singleInstance”独占一个task,其它activity不能存在那个task里;如果它启动了一个新的activity,不管新 的activity的launch mode 如何,新的activity都将会到别的task里运行(如同加了FLAG_ACTIVITY_NEW_TASK参数)。而另外三种模式,则可以和其它activity共存。

      总结:启动activity方法的不同,是否为应用间调用,不同activity加载模式都会造成预期的影响。太晚了,先发表吧,过几天会修复的。   

  • 相关阅读:
    树形视图和列表视图中的HitTest
    VC++中隐藏代码
    C++指针&引用简笔
    自动化流程学习笔记
    xampp for linux遇见的几个问题
    django用户验证模块核心
    win+r 快捷
    python 获取桌面路径
    我的linux常用操作
    个人悟出的一些观点
  • 原文地址:https://www.cnblogs.com/slider/p/2290430.html
Copyright © 2020-2023  润新知