Activity 启动模式
standard(标准模式) 系统不会在乎这个活动是否已经在返回栈中存在,而是每次启动活动都会创建该活动的一个新的实例。
singleTop (栈顶复用) 在启动活动时,如果发现该返回栈的栈顶已经是该活动时,则认为可以直接使用它,不会在创建新的活动实例
singleTask (栈内单例) 每次启动该活动时,首先会在返回栈中检查是否存在该活动的实例,如果发现已经存在就直接使用该实例,并把这个活动之上的所有活动统统出栈,如果没有发现就会创建一个新的活动实例。
singleInstance (堆内单例) 会启用一个新的返回栈来管理这个活动,不管是哪个应用程序来访问这个活动,都共用的同一个返回栈,解决了共享活动实例的问题。
在 singleTop、singleTask、singleInstance 中如果在应用内存在Activity 实例,并且再次发生 startActivity(Intent intent)回到 Activity后,由于并不是重新创建 Activity 而是复用栈中的实例,因此 Activity再 获 取 焦 点 后 并 没 调 用 onCreate 、 onStart , 而是直接调用了onNewIntent(Intent intent)函数;
taskAffinity属性
taskAffinity 是 Activity 在 mainfest 中配置的一个属性,暂时可以理解为:taskAffinity为宿主 Activity指定了存放的任务栈 不同于 App中其他的 Activity的栈 为 activity 设置 taskAffinity 属性时不能和包名相同,因为 Android 团队为 taskAffinity 默认设置为包名任务栈。
taskAffinity 只有和 SingleTask 启动模式匹配使用时,启动的 Activity 才会运行在名字和 taskAffinity 相同的任务栈中
Intent 中标志位设置启动模式
在上文中的四种模式都是在 mainfest 的 xml 文件中进行配置的,GoogleAndroid 团队同时提供另种级别更高的设置方式,即通过
Intent.setFlags(int flags)设置启动模式;
- FLAG_ACTIVITY_CLEAR_TOP : 等 同 于 mainfest 中 配 置 的singleTask,没啥好讲的;
- FLAG_ACTIVITY_SINGLE_TOP: 同 样 等 同 于 mainfest 中 配 置 的singleTop;
- FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS: 其 对 应 在AndroidManifest 中的属性为 android:excludeFromRecents=“true”,
当用户按了“最近任务列表”时候,该 Task 不会出现在最近任务列表中,可达到隐藏应用的目的。 - FLAG_ACTIVITY_NO_HISTORY: 对应在 AndroidManifest 中的属性为:android:noHistory=“true”,这个 FLAG 启动的 Activity,一旦退出,它不会存在于栈中。
- FLAG_ACTIVITY_NEW_TASK: 这个属性需要在被 start 的目标 Activity 在AndroidManifest.xml 文件配置 taskAffinity 的值【必须和 startActivity发起者 Activity 的包名不一样,如果是跳转另一个 App 的话可以taskAffinity 可以省略】,则会在新标记的 Affinity 所存在的 taskAffinity中压入这个 Activity
LauchMode | Instance |
---|---|
standard | 邮件、mainfest中没有配置就默认标准模式 |
singleTop | 登录页面、WXPayEntryActivity、WXEntryActivity、推送通知栏 |
singleTask | 程序模块逻辑入口主页面(Fragment的containerActivity)、WebView页面、扫一扫页面、电商中;购物界面,确认 Singlfask 订单界面,付款界面 |
singlenstance | 系统Launcher、锁屏键、来电显示等系统应用 |
Intent 的基本应用
Intent 属性
1.Intent 属性
Intent 的属性有:component(组件)、action、category、data、extras、flags;所有的属性也是各显神通,满足开发者的各种需要满足不同场景;category是系统的配置,action中的name是自己随便定义的,定义好以后name的值就是activity的动作,隐式启动activity时,意图中的配置必须和这里的action的name是一致的。data是跳转的过程中携带的参数,mimeType是携带的数据的类型,
component: 显然就是设置四大组件的,将直接使用它指定的组件,借助这一属性可以实现不同应用组件之间通讯;
action: 是一个可以指定目标组件行为的字符串,开发人员可以自定义 action通过匹配 action 实现组件之间的隐士跳转,当然 Android 系统也已经预定部分String 作为系统应用 Action,例如打开系统设置页面等等;
data: 通常是 URI 类型或者 MIME 类型格式定义的操作数据;表示与动作要操纵的数据
Category: 属性用于指定当前动作(Action)被执行的环境;
extras 和 flags 这两个太熟悉了就不在重复;
Intent 与 IntentFilter 匹配规则
横竖屏切换等引起的 Activity 生命周期的变化
这里的系统配置改变是指由于横竖屏切换等引起的 Activity 生命周期的变化,进
而引发的资源的变化。在 Android 中系统配置改变是会引起 Activity 销毁重建
的,例如横竖屏切换,只是切换时间差太小,用户眼睛不能察觉而已。activity
重建的时候就在之前 Activity 销毁前,系统会先调用
onSaveInstanceState(Bundle outState)
存储当时各种状态,在新建 Activity
中 Android 会通过 onRestoreInstanceState(Bundle savedInstanceState)
读
取数据并自动恢复到之前 Activity 的 View。
触发onSaveInstanceState(Bundle outState)的条件
-
Activity 被销毁的时候调用, 也可能没有销毁就调用了;
-
按下Home键 : Activity 进入了后台, 此时会调用该方法;
-
按下电源键 : 屏幕关闭, Activity 进入后台;
-
启动其它 Activity : Activity 被压入了任务栈的栈底;
-
横竖屏切换 : 会销毁当前 Activity 并重新创建;
onSaveInstanceState方法调用注意事项
- 用户主动销毁不会调用 : 当用户点击回退键 或者 调用了 finish() 方法, 不会调用该方法;
- 调用时机不固定 : 该方法一定是在 onStop() 方法之前调用, 但是不确定是在 onPause() 方法之前 还是 之后调用;
- 布局中组件状态存储 : 每个组件都 实现了 onSaveInstance() 方法, 在调用函数的时候, 会自动保存组件的状态, 注意,只有有 id 的组件才会保存;
- 关于默认的 super.onSaveInstanceState(outState) : 该默认的方法是实现 组件状态保存的;
onRestoreInstanceState(Bundle outState)
- 方法回调时机 : 在 Activity 被系统销毁之后 恢复 Activity 时被调用, 只有销毁了之后重建的时候才调用,
如果内存充足, 系统没有销毁这个 Activity, 就不需要调用; - Bundle 对象传递 : 该方法保存的 Bundle 对象在 Activity 恢复的时候也会通过参数传递到 onCreate()方法中;
横竖屏切换时Activity的生命周期变化?
1.如果自己没有配置android:ConfigChanges,这时默认让系统处理,就会重建Activity,此时Activity的生命周期会走一遍。
2.如果设置android:configChanges=“orientation|keyboardHidden|screenSize”>
,此时Activity的生命周期不会重走一遍,Activity不会重建,只会回调onConfigurationChanged方法。
configChanges属性总结:
mcc | 移动国家号码,由三位数字组成,每个国家都有自己独立的MCC,可以识别手机用户所属国家。 |
mnc | 移动网号,在一个国家或者地区中,用于区分手机用户的服务商。 |
locale | 所在地区发生变化。 |
touchscreen | 触摸屏已经改变。(这不应该常发生。) |
keyboard | 键盘模式发生变化,例如:用户接入外部键盘输入。 |
keyboardHidden | 用户打开手机硬件键盘 |
navigation | 导航型发生了变化。(这不应该常发生。) |
orientation | 设备旋转,横向显示和竖向显示模式切换。 |
fontScale | 全局字体大小缩放发生改变 |
onConfigurationChanged方法
在 Activity、View(ViewGroup)、Fragment、Service、Content Provider
等等在设备的配置发生变化的时候,会回调 onConfigurationChanged 的方法。