一个项目搞明白Android 启动模式和taskAffinity
2016-07-27 17:33
507 查看
一个项目搞明白Android 启动模式和taskAffinity
新建两个Activity,带一个TextView和两个Button,TextView用于显示当前Activity, 两个Button分别用于启动两个Activity:MainActivity和SecondActivitymTextView.setText(getClass().getSimpleName() + " && TaskId = " + getTaskId()); mButton1.setText("启动MainActivity"); mButton1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, MainActivity.class); startActivity(intent); } }); mButton2.setText("启动SecondActivity"); mButton2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); startActivity(intent); } });
通过修改AndroidManifest.xml文件中两个Activity的启动模式和taskAffinity来测试各个启动模式带来的不同体验
以下M表示MainActivity,S表示SecondActivity
当两个Activity的launchMode都是standard时:
按Button启动Activity顺序:
MMSMMSMMS
1 2 3 4 5 6 7 8 9
按Back键的依次回退的Activity和顺序:
MMSMMSMMS
9 8 7 6 5 4 3 2 1
TaskId一直未变,表示在同一个Task栈中。
当MainActivity的launchMode是standard, SecondActivity的launchMode是singleTop时:
按Button启动Activity顺序:
MMSSMMS
1 2 3 4 5 6 7
按Back键的依次回退的Activity和顺序:
MMSMMS
6 5 4 3 2 1
TaskId一直未变,表示在同一个Task栈中。
当在S界面再次按Button意图启动S时,是无法启动的。
当MainActivity的launchMode是standard, SecondActivity的launchMode是singleTask,且taskAffinity为非默认值时:
按Button启动Activity顺序:
MMSSMMS
1 2 3 4 5 6 7
按Back键的依次回退的Activity和顺序:
MMS
3 2 1
TaskId的值出现了增长,表示当启动S的时候,开启了一个新的Task。
当MainActivity的launchMode是standard, SecondActivity的launchMode是singleTask,且taskAffinity为默认值时:
按Button启动Activity顺序:
MMSSMMS
1 2 3 4 5 6 7
按Back键的依次回退的Activity和顺序:
MMS
3 2 1
TaskId一直未变,表示在同一个Task栈中。
当MainActivity的launchMode是standard, SecondActivity的launchMode是singleInstance时:
按Button启动Activity顺序:
MMSSMMS
1 2 3 4 5 6 7
按Back键的依次回退的Activity和顺序:
MMMMS
3 2 1
TaskId在S时变化,表示S在另一个Task栈中。
按Button启动Activity顺序:
MMSSMMSMM
1 2 3 4 5 6 7 8 9
按Back键的依次回退的Activity和顺序:
SMMMMMM
7 6 5 4 3 2 1
TaskId在S时变化,表示S在另一个Task栈中。
launchMode模式总结现在,总结一下launchMode的四种模式:
1. standard它是默认模式。在该模式下,Activity可以拥有多个实例,并且这些实例既可以位于同一个task,也可以位于不同的task。
2.singleTop该模式下,在同一个task中,如果存在该Activity的实例,并且该Activity实例位于栈顶(即,该Activity位于前端),则调用startActivity()时,不再创建该Activity的示例;而仅仅只是调用Activity的onNewIntent()。否则的话,则新建该Activity的实例,并将其置于栈顶。
3. singleTask顾名思义,只容许有一个包含该Activity实例的task存在!
总的来说:singleTask的结论与android:taskAffinity相关。以A启动B来说
(01) 当A和B的taskAffinity相同时:第一次创建B的实例时,并不会启动新的task,而是直接将B添加到A所在的task;否则,将B所在task中位于B之上的全部Activity都删除,然后跳转到B中。
(02) 当A和B的taskAffinity不同时:第一次创建B的实例时,会启动新的task,然后将B添加到新建的task中;否则,将B所在task中位于B之上的全部Activity都删除,然后跳转到B中。
4. singleInstance顾名思义,是单一实例的意思,即任意时刻只允许存在唯一的Activity实例,而且该Activity所在的task不能容纳除该Activity之外的其他Activity实例!
它与singleTask有相同之处,也有不同之处。
相同之处:任意时刻,最多只允许存在一个实例。
不同之处:(01) singleTask受android:taskAffinity属性的影响,而singleInstance不受android:taskAffinity的影响。 (02) singleTask所在的task中能有其它的Activity,而singleInstance的task中不能有其他Activity。 (03) 当跳转到singleTask类型的Activity,并且该Activity实例已经存在时,会删除该Activity所在task中位于该Activity之上的全部Activity实例;而跳转到singleInstance类型的Activity,并且该Activity已经存在时,不需要删除其他Activity,因为它所在的task只有该Activity唯一一个Activity实例。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories