读书笔记Activity生命周期和启动

来源:互联网 发布:免费的微信多开软件 编辑:程序博客网 时间:2024/05/23 20:50
Activity:
  • 生命周期
  • 启动模式
  • 任务栈
  • 标记位
  • Intent匹配规则

生命周期:
  • 整个生命周期
    • onCreate()---onDestory(),在onDestory()中要注意释放资源.
  • 可见生命周期
    • onStart()---onStop(),在前台,能与用户交互,但是没有焦点.可以在这2个方法之间保留向用户展示的资源.
  • 前台生命周期
    • onResume()---onPause(),能与用户交互.可能发生的很频繁.只适合做轻量级的操作.

    可见生命周期和前台生命周期的区别:
     可见生命周期只能看到而不能与用户发生交互.而前台生命周期可以和用户发生交互。比如A启动了一个透明的ActivityB。A是可见的,B是前台 的。B能够与用户交互而A不能。

  • 生命周期图

  • 异常情况下的生命周期:
    • 系统配置发生改变:
与正常情况下的生命周期相比,多了2个方法onSaveInstanceState和onRestoreInstanceState方法。这2个方法分别在系统回收与创建Activity的时候调用.可以在onSaveInstanceState保存数据,在下次Activity重启的时候在onRestoreInstanceState恢复这个数据.
  • 资源内存不足导致低优先级的Activity被杀死 
分级
1.前台Activity
2.可见但是非前台的Activity
3.后台Activity,已经被暂停的Activity.

系统会按照优先级从低到高回收.这种也可以使用上面的方法回收与恢复数据. 

怎么避免Activity被销毁重建.可以在清单文件中指定 android.configChanges="orientition|keyboardHidden"这种情况下会调用Activity的onConfigurationChanged()方法
keyboardHidden:键盘的可访问性发生了改变,比如用户调出了系统键盘
orientition:用户朝向发生了改变比如手机旋转了屏幕screenSize:屏幕尺寸发生了改变(Api13新添加,当target和minSdkVersion都<13不会被重启,否则就会被重启.)


启动模式
    启动模式主要用来定义activity的启动方式.在清单文件中为launchMode属性.不同的启动模式有不同的行为.
1.standard:
2.singleTop:栈顶复用.栈顶多次调用也只会存在一个.会调用onNewIntent方法
3.singleTask:栈内复用.有clearTop的效果.开启singleTask的Activity A,会先看是否存在A需要的任务栈,如果不存在,就会创建任务栈并且把A放入任务栈中(一般是打开其他应用的Activity.比如拍照,浏览器等).如果存在,先看栈中是否有A这个任务,如果有就把A上的任务弹出并且调用A的onNewIntent方法.没有就会创建A的实例并压入栈内.                     
特殊情况:现在存在2个任务栈S1,S2.S1中有ActivityA和B.S2中有ActivityC和D,CD是singleTask的.这时B打开D.D所在的整个任务栈都会移动到S1之上.S1找那个存在ABCD四个Activity.
4.singleInstance:单实例任务:栈内只会有一个该实例存在(这个同时有singleTask的效果).

任务栈:
TaskAffinity这个参数表示任务相关性,它是用来指定Activity运行的任务栈的.默认情况下这个参数的值就是应用的包名称.如果需要自行指定必须和singleTask或者allowTaskReparenting属性配对使用.

  • 和singleTask配对使用
    这种情况Activity会运行在TaskAffinity的任务栈中,任务栈的名字就是TaskAffinity的属性名.
  • 和allowTaskReparenting结合
    allowTaskReparenting = true的时候,当一个应用S1启动了应用S2的Activity A的时候,A是运行在S1的任务栈中,这时打开S2应用,A会被转移到S2的任务栈.                                                              

  • 2种指定启动模式的区别:
清单文件中定义launchMode
代码中指定addFlags指定
第一种无法具有cleartop的行为,第2种无法指定singleInstance   

Activity的Flag 
    标记位的作用有很多,可以设定启动模式,可以指定影响Activity的运行状态等.
    FLAG_ACTIVITY_CLEAR_TOP:如果是和FLAG_ACTIVITY_SINGLE_TASK一起使用,会调用它的onNewIntent方法,如果是standard的启动模式,那么它与它之上的Activity都要出栈.系统会创建新的Activity实例并放入栈顶.
    FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:具有这个标记的Activity不会出现在历史Activity的列表中.等同于XML中指定 android:excludeFromRecents="true"

Intent匹配规则
 通过隐式意图startActivity的时候,系统会为activity匹配IntentFilter,Filter中包含3个标签:action,category,data.只有通过了这3个标签的匹配,Intent才会匹配成功.清单文件中一个activity可能有多个IntentFilter,只需要匹配其中任意一个就能匹配成功.

  • Action匹配规则:
action是一个字符串,用来定义这个Activity的行为.比如Android自带的`android.intent.action.VIEW"`它常用来表示查看图片.它的匹配规则是只有大小写也完全匹配的时候才能匹配成功.清单文件中必须要申明.Intent中也必须含有action.
  • Category匹配规则:
 category也是一个区分大小写的字符串.在清单文件中必须声明默认的category.即`android.intent.category.DEFAULT`,但是在Intent中可以不必要指定,如果没有category系统会默认为它指定`android.intent.category.DEFAULT`
  • Data匹配规则:
data主要包含2个部分mimeType和URI 
  1. mimeType:这个属性主要表示媒体类型.image/*,video/mp4文本等多媒体类型
  2. URI:  `<scheme>://<host>:<port>/[<path>|<pathPrefix>|<pathPattern>]` 
content://com.example.project:200/floder/subfloder/etc
http://www.baidu.com:80/search/info
  
1.scheme:http,file,content等,如果URI没有指定scheme,那么整个路径是无效的.
2.host:主机    ,如果没有指定,那么整个路径也是无效的.
3.port:如果没有scheme和host.port单独存在是无效的.
4.path,pathPrefix,PathPattern这3个都表示路径信息.

path/pathPrefix/pathPattern这3者的区别.

    1.path表示完整的路径
    2.pathPrefix表示路径的前缀信息
    3.pathPattern指定一个要跟Intent匹配的完整路径.但是路径中可以包含通配符 *

1.*表示任意多个*之前的那个字符比如 a* 可以是aaa,也可以是aaaaaaaaaaaaaaaaa
2.点跟星号的组合(.*)通配符,它可以跟任意字符串进行匹配,如.*html,可以跟abchhtml、chtml、html、dssf.html、…等字符串匹配。
3.系统读取xml的时候需要转义"*"要被写成"\\*",符号'\'要被写成"\\\\"