Android SingleTask 探究

Android 4种启动模式来说,用法说明此处不再提及主要介绍SingleTop,SingleTask相关的问题

说明

  • 先分析 官方文档 中的一段话:

    As shown in the table above, standard is the default mode and is appropriate for most types of activities. SingleTop is also a common and useful launch mode for many types of activities. The other modes — singleTask and singleInstance — are not appropriate for most applications, since they result in an interaction model that is likely to be unfamiliar to users and is very different from most other applications.

??对于大多数应用来说,SingleTask 和 SingleInstance 并不适用,standrd 和 SingleTop对于普通的大部分Activity启动是适用的。
之所以使用singleTask,是存在这样一类问题,想要从后面的Activity 直接跳转到前面某一个Activity时,可能会采用的,如一个应用的MainActivity,LoginActivity等。

??对于SingleTask模式,官方文档的这么一句话,坑了不少人(我还比较幸运,没被坑惨),也带给我对之前知识的迷惑。

The system creates a new task and instantiates the activity at the root of the new task

??其实事实根本不是这样的!!!

场景复现

  • 下面用代码事实说话:建立3个Activity,分别为Main1Activity、Main2Activity、Main3Activity,前两个都设定单击事件,跳转逻辑为:main1 -> main2 -> main3,其中 Main2Activity 为 SingleTask(AndroidManifest.xml中设置)。打印相应的生命周期方法和所在的 taskId

??这些taskid都是一样的,所以它们都是同一个Task中的。事实胜于雄辩。然后搜了一下相关问题,老罗的博客还是给力,彻彻底底的分析了这个坑。致谢老罗的开源精神!
??链接:http://blog.csdn.net/luoshengyang/article/details/6714543

  • 同时为了解释项目中类似的一个页面跳转问题,对于上面的demo做了修改:

    将 Main1Activity 设置为 SingleTask,其余2个为standrd

    操作步骤:

    1. 点击图标启动此应用
    2. 依次点击进入 Main2,Main3,再点击Home键
    3. 点击应用图标重新进入

      操作结果:结果再次显示的是Main1Activity,而不是Main3Activity。

      先看看打印的日志:

      大专栏  Android SingleTask 探究9.cos.ap-beijing.myqcloud.com/blog/files/SingleTask%E5%9B%BE2.png" />

      再次点击图标进入应用时,实际上是Main2Activity,Main3Activity 出栈了。
      分析下这个过程:

      Main1,Main2,Main3 依次压入栈中,然后 Home 键,则整个Task处于stop状态,是一个background Task。当再次点击应用图标时,系统检测到此时已经存在一个该应用的Task的,此时就将此Background Task 移至前台,成为Foreground Task,而且由于Main1Activity是SingleTask,且位于task底部,所以,再次启动时,将前两个Activity移除,且按照启动顺序依次移除,所以打出的日志是:Main2 desotry,Main3 destory,Main1 onResume。

那么,如何才能在一个新的任务栈里创建新的Activity呢?

  • 只需要在AndroidManifest.xml中配置即可

    在SingleTask的基础之上,再增加设置 taskAffinify 属性即可,默认情况下,taskAffinity属性值为 包名,所以可以自定义一个taskAffinity值,便可以实现一个新的Task,新的Activity处于这个新的Task的root。如,我的 Demo 代码如下:

总结

  • SingleTask的启动模式并不会启动一个新的任务栈来承载Activity,而是在原来的Task中
  • SingleTask的启动模式,在官方文档的说明中,日常开发中并不建议使用,SingleInstance更是如此。
  • Activity的启动模式会带来的Task的变化和Activity的生命周期变化都会在ActivityRecord中体现的,通过源码分析可以发现。
  • 通过以下命令,可以查看Task内的Activity的变化:
    adb shell dumpsys activity  获取所有应用的activity堆栈信息
    adb shell dumpsys activity | grep com.xxx.xxx.xxx   获取某个应用的activity 堆栈信息
    adb shell dumpsys activity | grep mFocusedActivity  获取处于栈顶的Activity
    
  • http://blog.piasy.com/2016/03/19/Android-Task-And-Back-Stack/ (写完此文后,发现有高人已经写得很全面很详尽了)

原文地址:https://www.cnblogs.com/sanxiandoupi/p/11693112.html

时间: 2024-11-10 08:06:41

Android SingleTask 探究的相关文章

Android Camera探究之路——起步

Android Camera探究之路--起步 Camera在手机中有着举足轻重的地位,无论是二维码还是照片.识别.都离不开摄像头,本文将对Android中的Camera进行全面解析. 权限镇楼: <uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE&

Android singleTask 和singleInstance的区别

上周三去了网易面试被问到了这个问题,当时没有回答正确,回来以后特地写了一个程序研究一下. 关于Android activity的启动模式一共有四种 standard singleTop singleTask singleInstance 这四种 standard 和singleTop都比较好理解,这里主要研究一下 singleTask singleInstance的区别 首先是:singleTask 假设有两个Activity 分别是A 和 B ,Activity A的启动模式是standard

mono for android 深入探究APK包结构

mono for android 先说下mono的大概编译结构 第一个文件夹(assemblies) 第二个文件夹 下面是很重要的东西,就是mono的虚拟机 ,可以打开看到, 是so结尾的文件,这是c++编写的虚拟机, 这个虚拟机大概是2.8M左右.另外引用的第三方库,包括.so .jar 包都在里面. 第三个--资源 包括图片,layout 等 比原生java开发多了些什么 最后一个文件夹都有 中间这个文件夹多了2.8M 第一个文件夹(主要是这个)多了些撒 第一个文件夹的这些程序集很显然很多都

Android艺术——探究Handler运行机制

我们从开发的角度来说,Handler是Android 的消息机制的上层接口.说到Handler,大家都会说:哦,Handler这个我知道干什么的,更新UI.没错,Handler的确是用于更新UI的,具体来说是这样的:有时我们需要在子线程中进行耗时的I/O操作,而在此操作完成后需要在UI上有所变化,在Android开发中,我们是不能够在子线程中访问UI控件的,这时我们的主角Handler就出场了,可以将更新UI的操作切换到主线程中执行.从中我们可以看出Handler并不是专门用于更新UI的,只不过

android canvas探究

protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub super.onDraw(canvas); //构造两个画笔,一个红色,一个绿色 Paint paint_green = generatePaint(Color.GREEN, Style.STROKE, 3); Paint paint_red = generatePaint(Color.RED, Style.STROKE, 3); //构造一个矩形

Android BroadcastReceiver 广播深入研究

Android深入探究笔记之二十 -- 广播接收者,BroadcastReceiver 1. 简单概述 广播被分为两种不同的类型:"普通广播(Normal broadcasts).有序广播(Ordered broadcasts).粘性消息". 普通广播是完全异步的,可以在同一时刻(逻辑上)被所有接收者接收到,消息传递的效率比较高. 但缺点是:接收者不能将处理结果传递给下一个接收者,并且无法终止广播Intent的传播. 有序广播是按照接收者声明的优先级别,被接收者依次接收广播.广播传输过

android 布局之滑动探究 scrollTo 和 scrollBy 方法使用说明

涉及到滑动,就涉及到VIEW,大家都知道,android的UI界面都是由一个一个的View以及View的派生类组成,View作为基类,而常用的布局里面的各种布局就是它派生出来的ViewGroup的子类,ViewGroup作为各个组件的容器搭建了整体的UI.以下是android UI的结构示示意图: 查看源码 /** * Implement this to do your drawing. * * @param canvas the canvas on which the background w

Android主题切换—夜间/白天模式探究

现在市面上众多阅读类App都提供了两种主题:白天or夜间. 上述两幅图片,正是两款App的夜间模式效果,所以,依据这个功能,来看看切换主题到底是怎么实现的(当然现在github有好多PluginTheme开源插件,很多时候可以使用这些插件,不过我并不想讲怎么用那些插件,正所谓会用轮子还不如会造轮子). 关于更换主题和换肤 这里提到是做换主题功能,当然与之类似的就是换肤,换肤现在比较流行的是采用插件化动态加载技术来实现的,这样可以起到热插拔作用,需要皮肤时候用户自主的在网上下载便是了,不用皮肤时便

Android:日常学习笔记(8)———探究UI开发(5)

Android:日常学习笔记(8)---探究UI开发(5) ListView控件的使用 ListView的简单用法 public class MainActivity extends AppCompatActivity { private String[] data={"Apple","Banana","Orange","Watermelon","Pear","Grape","