本文内容来自《Android开发艺术探索》第一章,个人学习提炼总结,欢迎指正。
1.1典型情况下的生命周期
- onCreate():表示Activity正在被创建,初始化布局资源+Activity所需要数据等。
- onStart():表示Activity正在启动,Activity已经可见,但是未出现在前台(正在显示),不可与用户交互。
- onResume():表示Activity获得焦点,已经可见,并在前台开始活动。
手动分割线
- onPause():表示Activity正在停止,正常情况下调用onStop,若快速返回到当前Activity,则先执行完onPause,再调用onResume。
- onStop():表示Activity即将停止,可做稍微重量级回收工作,如取消网络连接、注销广播接收器。
- onDestory():表示Activity即将销毁,回收工作+资源释放。
- onRestart():表示Activity正在重启,此时Activity从后台到前台,由不可见到可见。
onStart()和onResume()、onPause()和onStop()的区别:
- onStart与onStop是从Activity是否可见这个角度调用的。
- onResume和onPause是从Activity是否显示在前台这个角度来回调的。
- 在实际使用没其他明显区别。
生命周期的切换过程:
用-连接的表示在用一个Activity中进行。
(1)启动新Activity:onCreate-onStart-onResume。
(2)打开新Activity/切换到桌面:旧onPause,新onCreate-onStart-onResume,旧onStop。
- (↑若新Activity采用透明主题,那么当前Activity不会回调onStop)
- (↑android:theme=”@android:style/Theme.Translucent”)
(3)回到原来Activity:当前Activity的onPause,原Activity的onRestart-onStart-onResume,当前Activity的onStop-onDestory。
(4)用户按下back键回退:onPause-onStop-onDestory。
(5)Activity1上弹出对话框Activity2:1的onPause,2的onCreate-onStart-onResume。【与(2)对应比较】
(6)关闭对话框Activity2,显示Activity1:2的onPause(),1的onResume(),2的onStop()-onDestroy()。【与(3)对应比较】
异常情况下生命周期分析
(1)系统资源配置发生改变导致Activity被杀死并重新创建
- 系统会调用onSaveInstanceState保存数据,调用onPause,onStop,onDestory销毁Activity,onSaveInstanceState会在onStop前调用,不一定在onPause的前面或后面调用。
- 创建新Activity后用onRestoreInstanceState恢复数据,onRestoreInstanceState中的onCreate的参数是onSaveInstanceState方法保存的Bundle对象。
- (可真长呢这句话...简单点说新Activity的参数是旧Activity传递来的对象)
(2)资源内存不足导致低优先级的Activity被杀死
- 一个进程如果没有四大组件在执行很快会被系统杀死,因此后台工作不适宜脱离四大组件独自运行在后台中,解决方法:将后台工作放入Service中从而保证进程有一定优先级,不会被轻易杀死。
- (果然四大组件才是老大,那会被艰难的杀死吗???)
1.2Activity的启动模式
1.2.1设置Activity启动模式的方法
(1)在AndroidManifest.xml中给对应的Activity设定属性
ndroid:launchMode="standard|singleInstance|single Task|singleTop"。
(2)通过标记位设定,方法是intent.addFlags(Intent.xxx)。
1.2.2Activity的四种LaunchMode
(1)standard:标准模式、默认模式
- 每次启动一个Activity就会创建一个新的实例。
- 注意:使用ApplicationContext去启动standard模式Activity就会报错。因为standard模式的Activity会默认进入启动它所属的任务栈,但是由于非Activity的Context没有所谓的任务栈。
(2)singleTop:栈顶复用模式
- 如果新Activity已经位于任务栈的栈顶,就不会重新创建,并回调onNewIntent(intent)方法。
(3)singleTask:栈内复用模式
- 只要该Activity在一个任务栈中存在,都不会重新创建,并回调onNewIntent(intent)方法。如果不存在,系统会先寻找是否存在需要的栈,如果不存在该栈,就创建一个任务栈,并把该Activity放进去;如果存在,就会创建到已经存在的栈中。
(4)singleInstance:单实例模式
- 具有此模式的Activity只能单独位于一个任务栈中,且此任务栈中只有唯一一个实例。
标识Activity任务栈名称的属性:android:taskAffinity,默认为应用包名。
1.2.3常用的可设定Activity启动模式的标记位
FLAG_ACTIVITY_SINGLE_TOP:对应singleTop启动模式。
FLAG_ACTIVITY_NEW_TASK :对应singleTask模式。
1.3IntentFilter匹配规则
1.3.1匹配原则
(1)一个intent只有同时匹配某个Activity的intent-filter中的action、category、data才算完全匹配,才能启动该Activity。
(2)一个Activity可以有多个 intent-filter,一个 intent只要成功匹配任意一组 intent-filter,就可以启动该Activity。
1.3.2匹配规则
(1)action匹配规则:
- 要求intent中的action 存在且必须和intent-filter中的其中一个 action相同。
- 区分大小写。
(2)category匹配规则:
- intent中的category可以不存在,这是因为此时系统给该Activity 默认加上了< category android:name="android.intent.category.DEAFAULT" />属性值。
- 除上述情况外,有其他category,则要求intent中的category和intent-filter中的所有category 相同。
(3)data匹配规则:
- 如果intent-filter中有定义data,那么Intent中也必须也要定义date。
- data主要由mimeType(媒体类型)和URI组成。在匹配时通过intent.setDataAndType(Uri data, String type)方法对date进行设置。