参考网址:Android开发艺术探索笔记——第一章:Activity的生命周期和启动模式
1.activity 第一次启动的时候,回调如下:onCreate ——> onStart ——> onResume
2. 当用户打开新的activity或者切换到桌面的时候,回调如下::onPause ——> onStop ——>
这里有一种特殊情况,如果新的activity采取了透明的主题,那么当前activity不会回调onStop
3.当用户再次回到原来的activity,回调如下:onRestart ——> onStart ——> onResume
4.当用户按back键的时候,回调如下:onPause ———> onStop ——> onDestroy
5.当activity被系统回收的时候再次打开,生命周期和1是一样的。
但是需要注意的是,只是生命周期一样,不代表所有的进程都是一样的;
6. onCreate和onDestroy对应;
onStart和onStop是配套的
onResume和onPause是配套的
onStart和onStop ,onResume和onPause ,这两者的区别在于activity是否可见,其他大体一样
.假设当前Activity为A,如果用户打开了一个新的Activity为B,那么系统会先调用A的onPause,然后调用B的onResume
旧的Activity的onPause先调用,然后新的Activity才启动(oncreate,onstart,onresume)
onPause和onStop都不能做耗时的操作,尤其是onPause,这也意味着,我们应当尽量的在onStop中做操作,从而使新的Activity尽快显示出来并且换到前后台
当系统配置发生改变的时候,Activity会被销毁,其onPause,onStop,onDestroy均会被调用,同时由于Activity是异常情况下终止的,系统会调用onSaveInstanceState来保存当前Activity的状态
这个方法调用的时机是在onStop之前,他和onPause没有既定的时序关系,他即可能在onPause之前调用,也有可能在之后调用
需要强调的是,onSaveInstanceState方法只出现在Activity被异常终止的情况下,正常情况下是不会走这个方法
当我们onSaveInstanceState保存到Bundler对象作为参数传递给onRestoreInstanceState和onCreate方法,因此我们可以通过onRestoreInstanceState和onCreate方法来判断Activity是否被重建。如果被重建了,我们就取出之前的数据恢复
从时序上来说,onRestoreInstanceState的调用时机应该在onStart之后
首先我们在onSaveInstanceState中保存一个字符串,然后当我们的Activity被销毁并且重新创建之后,我们再去获取之前存储的字符串,接收的位置可以选择onRestoreInstanceState或者onCreate,两者的区别是:onRestoreInstanceState一旦被调用,其参数Bundler savedInstanceState一定有值,我们不用额外的判断是否为空但是onCreate不行,onCreate如果正常启动的话,其参数Bundler onSaveInstanceState为null,所以需要一些额外的判断,这两个方法我们选择任意一个都是可以进行数据恢复的,但是关键建议我们使用onRestoreInstanceState去恢复数据
系统只在Activity异常终止的情况下才会调用onSaveInstanceState和onRestoreInstanceState来存储和恢复数据,其他情况不会触发
Activity按照优先级的从高往低,可以分为三种:
当系统内存不足的时候,系统就会按照上述优先级去杀死目标Activity所在的进程,并且在后续通过onSaveInstanceState和onRestoreInstanceState来存储和恢复数据,
系统配置中有很多内容,如果当某项内容发生改变后,我们不想系统重新创建,就可以给configChangs属性加上orientation这个值
android:configChanges="orientation"
我们常用的只有locale,orientation,keyboardHidden这三个选项,其他用的还是比较少的
启动Activity分为两种,显示调用和隐式调用,显示调用需要明确的指定被启动对象的组件信息,
包括包名和类名,而隐式意图则不需要明确指定调用信息,隐式调用需要intent能够匹配目标组件的
IntentFilter中所设置的过滤信息,如果不匹配将无法启动目标Activity,IntentFilter中的过滤信息有
action,category,data
action是一个字符串;
intent中的action必须和过滤的action有一样的,才算匹配成功;
一个过滤规则中的可以有多个action;
action区分大小写
category是一个字符串;系统预定义了一些category
Intent如果出现了category,不管有几个category,对于每个category来说,它必须是过滤规则中已经定义的category;
Intent中可以没有category,如果没有category的话,这个Intent仍然可以匹配成功;
为什么不设置category也可以匹配呢?原因是系统在调用startActivity或者startActivityForResult的时候会默认为Intent加上“android.intent.category.DEFAULT”这个category,所以这个category就可以匹配前面的过滤规则中的第三个category。同时,为了我们的activity能够接收隐式调用,就必须在intent-filter中指定“android intent categor.DEFAULT”这个category
data由两部分组成,mimeType和URI,前者是媒体类型,比如image/jpeg等,可以表示图片等,而URI包含的数据可就多了,下面的URI的结构:
://"/[||]
例子:
content://com.liuguilin.project:200/folder/subfolder/etc
http://www.baidu.com:80/search/info