标签:conf 16px tty 通过 隐式 1.3 清除 1.2 技术分享
Activity是Android中四大组件之首,所以需要重视,尤其是启动方式,在AndroidManifest.xml中的注册信息
(一)Activity的生命周期
1.1.1 正常情况下的生命周期
说明
(1)针对一个特定的Activity,第一次启动顺序:onCreate->onStart->onResume.
(2)当用户打开新的Activity或者切换到桌面的时候,回调如下:onPause->onStop
(3)返回原Activity时,回调如下:onRestart->onStart->onResume.
(4)当用户按back返回是,回调如下:onPause->onStop->onDestroy
*onStart和onStop是从Activity是否课件这个角度来回调的,二onResume和onPause是从Activity是否位于前台这个角度来回调
*Activity的启动涉及Instrumention,ActivityThread和ActivityManagerService(简称AMS).
启动Activity的请求会由Instrumention来处理,然后它通过Binder向AMS发请求,AMS内部维护这一个ActivityStack并负责栈内的Activity的状态同步,AMS通过ActivityThread去同步Activity的状态从而完成生命周期方法的调用
(Android官方文档对onPause解释中,提醒不能再onPause中进行重量级的操作,因为必须onPause执行完之后新Activity才能Resume)
1.1.2 异常情况下的生命周期分析
(1)配置文件改变导致异常
说明:当系统配置发声改变后,Activity会被销毁,其onPause,onStop,onDestroy均会被调用,同时由于Activity是在异常情况下终止的,系统会调用onSaveInsatnceState来保存当前Activity的状态
(正常情况下是不会调用onSaveInsatnceState)
出现异常,系统的工作流程:Activity会调用onSaveInsatnceState去保存数据,然后Activity会委托Window去保存数据,接着Window再委托它上面的顶级容器去保存数据.
顶层容器是一个ViewGroup,一般来说它很可能是DecorView.最后顶级容器再去通知它的子元素来保存数据(委托思想,上层委托下层,容器委托子元素去处理事件)
(2)资源内存不足导致优先级低的Activity被杀死
解决方法:将后台工作放入Service中保证进程有一定的优先级,不会让系统杀死
*当配置文件改变时,Activity会重新创建,通过给activity指定configChanges属性.(哎AndroidMainfest.xml中加入声明)
*常用的三个选项:
1.2 Activity的启动模式
1.2.1 Activity的LaunchMode
*Activity所需的任务栈,与TaskAffinity(任务相关性),这个参数标识了一个Activity所需要的任务栈的名字,默认情况下,所有的Activity所需的任务栈的名字为应用的包名.
*可以为每个Activity都单独指定TaskAffinity属性,不同的名字代表不同的任务栈android:taskAffinity="属性值为字符串"
*任务栈分为前台任务栈和后台任务栈
*给Activity指定启动模式有如下两种方法:
栗子:intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
*第一种的优先级比第二种的要高
1.2.2 Activity的Flags
列出常用的:
1.3 IntentFilter的匹配规则
Activity的启动分为两种:显式调用和隐式调用.尽量使用隐式调用
显式调用:
需要明确地指定被启动对象的组件信息,包括包名和类名
隐式调用: 需Intent能够匹配目标组件的IntentFilter中所设置的过滤信息,IntentFilter中的过滤信息有action,category,data
不需要明确指定组件信息
*一个Intent同时匹配action类型,category类型,data类型才算完全匹配,才能启动目标Activity,一个Activity中可以有多个intent-filter,一个Intent只要能匹配任何一组intent-filter即可成功启动对应的activity
匹配规则
action的匹配要求Intent中的action存在且必须和过滤规则中的其中一个action相同.
2. category的匹配规则
Intent中可以没有category,如果有的话,每一个都需要能够和匹配过滤规则中的任何一个category相同.
*startActivity或者startActivityForResult的时候会默认为Intent加上"android.intent.category.DEFAULT"这个category
3. data的匹配规则
与action类似,如果过滤规则中定义了data,那么Intent中必须也要定义可匹配的data
data的语法:(由两部分组成,mimeType指的是媒体类型,和URI,结构:<scheme>://<host>:<port>/[<path>|<pathPrefix>|<pathPattern>]
<data android:scheme="string"
android:host="string"
port/path/pathPattern/pathPrefix/mimeType="string">
*栗子:在<intent-filter>中设定<data android:mimeType="image/*">匹配标签,那么Intent中的mimeType属性必须思维"image/*"才能匹配.
建议使用intent.setDatAndType,如果单独使用setData和setType,会互相清除对方的值
匹配栗子:
1 Intent intent = new Intent(""); 2 intent.addCategory(""); 3 intent.setDataAndType(Uri.parse(data), type); 4 startActivity(intent);
标签:conf 16px tty 通过 隐式 1.3 清除 1.2 技术分享
原文地址:http://www.cnblogs.com/JingQ/p/6166051.html