android开发艺术探索 学习笔记(二) Activity的启动模式
来源:互联网 发布:洗数据 编辑:程序博客网 时间:2024/05/31 06:24
一.为什么要有Activity的启动模式?
我自己在学习本书之前,做个过一个小程序,其中有一个功能是,点击通知栏的消息返回Activity 但是我遇到了麻烦,每次点击通知栏都会打开一个新的Acitivity,退出程序时要按好多下back键 于是百度搜索解决方法,才第一次接触到启动模式,这次就借本书,系统的学下。
二.4种启动模式
1.standard standard启动模式会创建一个新的Activity放入启动它的Context的任务栈中。 如果启动它的Context不存在任务栈,系统就会以给他创建一个新的任务栈,并以singleTask模式启动在这个新的任务栈中。2.singleTop singleTop会先去查看当前任务栈顶是否已经是我们要启动的Activity。 如果是那么将不会创建新的Activity(也就不会去调用,onCretea,onStart,onResume),将会回调onNewIntent来用于接收新的数据。3.singleTask singleTask会先去查看当前任务栈(注意:没有顶字)是否已经有我们要启动的Acitivity。 还有一点要注意的是,当Acitivity通过singleTask模式启动后到了任务栈的顶部,位于它前面的Acitivity都将会被弹出任务栈。4.singleInstance singleInstance具有singleTask的加强版,具有它的所有特性。 加强之处在于,singleInstance会给Activity建立一个独立的,特殊的任务栈,这个任务栈只能用于存放该Activity。 由于singleInstance和singleTask效果相同,所以该任务栈有且只有一个Activity。 放开来说,永远只有一个相同的该Activity。
如果后台任务栈中的Activity被请求那么后台任务栈会被压入到前台任务栈中。
压入过程有个特殊情况,如果被请求的Activity不再后台任务栈的顶部,会先把后台任务栈弹出到到当前要请求的Activity再送到前台
三.什么是Activity所需任务栈
1.在android程序中,Activity是由栈的形式来进行管理的,栈大家都知道是“后进先出”原则,所以如果我们启动activity的顺序是ABC,那么我们按back键显示的顺序就会是CBA。我们称为任务栈(Task)
四.Activity中有关Task的属性
1.taskAffinity这个属性表示我们启动Activity所在的任务栈,如果没有就会去创建这个任务栈。 taskAffinity的属性值不能为包名,不然没有意义,因为默认值为包名。taskAffinity常与singleTask启动模式或者allowTaskReparenting属性配合。2.allowTaskReparenting这个属性有点难理解,意思为Activity能否转移到他应该在的任务栈。举个例子:当我们有两个程序:APK1,APK2。APK1中有MainActivity与ActivityB。APK2中有MainActivity,APK2是一个可以处理ActivityB的程序。当APK1中的MainActivity.启动了带有allowTaskReparenting属性为真的ActivityB。这时我们按下Home键,然后打开APK2,显示的并不是APK2的MainActivity,而是ActivityB。一下为证实代码与截图
APK1中Activity属性设置
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.tasktextfirst"><application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".ActivityB" android:taskAffinity="com.example.tasktestsecond" android:allowTaskReparenting="true"></activity></application></manifest>
可以看到,ActivityB的taskAffinity改成APK2的包名,allowTaskReparenting设置为真
APK1中只要有个按钮用于启动ActivityB就好,APK2不用改写,只要包名对上就好。
以下为运行截图
先运行APK1
点击按钮启动ActivityB
按下Home键返回桌面,再启动APK2
还是ActivityB。
五.如何给Activity设置启动方式
1.AndroidManifest中为Activity添加属性。
android:launchMode="singleTask"
2.Intent启动时使用addFlag
Intent intent = new Intent(MainActivity.this,ActivityB.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent);
注意:两种方法均有办不到的时候.第一种无法设置FLAG_ACTIVITY_CLEAR_TOP标志第二种无法设置singleInstance启动方式.优先级:第二种>第一种,会覆盖.
六.FLAG介绍
1.FLAG_ACTIVITY_NEW_TASK等同于singleTask启动模式2.FLAG_ACTIVITY_SINGLE_TOP等同于singleTop启动模式3.FLAG_ACTIVITY_CLEAR_TOP配合FLAG_ACTIVITY_NEW_TASK使用会清楚要启动的Activity上的其他Activity出栈.然后调用onNewIntent配合standard,会连它自己与它之上的Activity都出栈,然后重新创建。4.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS禁止从历史列表回到该Acitivity.等同于属性`android:excludeFromRecents="true"`
阅读全文
0 0
- android开发艺术探索 学习笔记(二) Activity的启动模式
- Android开发艺术探索笔记一:Activity的启动模式
- Activity的启动过程(Android开发艺术探索学习笔记)
- 《Android开发艺术探索》之学习笔记(一)Activity的生命周期和启动模式
- android开发艺术探索 3 Activity的启动模式
- 《Android开发艺术探索》读书笔记----第一章:Activity的启动模式
- Android开发艺术探索-Activity的启动模式
- 《Android开发艺术探索》笔记之Activity的生命周期和启动模式
- Android开发艺术探索(研读笔记)——02-Activity的启动模式
- 《Android开发艺术探索》笔记 — Activity的生命周期和启动模式
- Android开发艺术探索笔记——第一章:Activity的生命周期和启动模式
- Android开发艺术探索笔记(2)- Activity的启动模式
- Android开发艺术探索笔记(一) Activity的生命周期和启动模式(1)
- Android开发艺术探索阅读笔记之一:Activity的生命周期和启动模式
- Android 开发艺术探索 学习笔记 Activity
- **读Android开发艺术探索学习笔记--Activity的生命周期**
- Android开发艺术探索--singleTask的启动模式--笔记
- Android开发艺术探索--Activity生命周期和启动模式
- spark源码之sparkEnv(1)RPC通信
- Java实现-打劫房屋2
- 拓扑排序
- leetcode 260. Single Number III
- Problem C
- android开发艺术探索 学习笔记(二) Activity的启动模式
- eclipsed的C/C++环境配置
- Error:SSL peer shut down incorrectly
- C++ 17 —— 纯虚函数
- HTML5 发布测试版本,通过网页在线安装ipa和apkH
- Problem E
- 百度之度度熊想去商场买一顶帽子,商场里有N顶帽子,有些帽子的价格可能相同。度度熊想买一顶价格第三便宜的帽子,问第三便宜的帽子价格是多少?
- 修改PostgreSQL中pg_hba.conf
- ContentType与http状态码