第一章主题就讲 activity的生命周期和启动模式 说实话启动模式懒得写 基本都懂
关于activity的生命周期 因为有可能会被异常终止 所以分两种情况 正常情况就不说了 直接放张图片就可以了
而异常情况 比如 configuration的改变 会造成activity被终止重建的 比如 键盘的显示隐藏 屏幕横竖屏的切换,当然还有其他的 ,那就不管了 ,当然对于这个 ,代码设置或者manifest那边设置下 android:configChanges = 某些值就好了 一般都是”orientation|keyboardHidden|screenSize”
书中有个问题很有意思 :当A界面 打开B界面 是A的onPause 先执行 还是B的onResume ?
他是说了源码这一块 ,不过自身对于这方面的研究没到位,改天看看,修改下这段文字就好了,其中涉及到一些听都没听过的存在,直接说结论:位于栈顶的A界面会先被onPause 然后B界面会被 onCreate onStart onResume 之后再是A界面的onStop
所以呢 在onPause 也不要做一些重量级的操作 这样会影响下一个界面的启动速度
在异常情况activity被终止时,onSaveInstanceState这个方法会被调用,正常情况 是不会调用这个方法的,所以可以在这个方法做一些保存的操作,然后在onCreate 或者onRestorInstanceState方法中 拿参数bundle ,拿之前保存的数据,虽然官方是推荐onRestoreInstanceState里面做恢复数据的操作,但是想想这么做的话,时常会做一些重复的操作,至少我是基本在onCreate中直接判断 操作的。
当然 onCreate在onRestorInstanceState方法之前被执行 然后后者在正常生命周期时,不会被执行。
至于onSaveInstanceState方法 在onPause方法之前 ,但不确定是在onPause的前后。
当然 对于一些view 他本身就有onSaveInstanceState之类的方法 ,会自动保存一些信息的,比如editText,他会自动保存已经输入的信息。还有listview的滚动位置啊之类的。其实他也是逐级告诉下去的 ,从activity开始 逐级委托保存好自己的信息。
onRestoreInstanceState如果被执行 ,其参数必定有值,其实这个知不知道 都无所谓,无非多判断一次。
对于activity的优先级
前台运行的activity是最优先的
其次是 可见但是非前台的activity 类似于 无法互动 无法点击的状态 比如弹出了个弹窗
再次是 后台的activity
这三个 在内存不足的情况下,依照优先级的高低 ,会被杀死以释放内存资源。
将一些后台工作 (耗时操作) 放在Service从而保证进程有一定的优先级,这样就不会轻易的被系统杀死。毕竟一个进程里面没有四大组件运行的话,就会很快的被系统杀死。
启动模式launchMode
四种启动模式 :standard,singleTop ,singleTask,singleInstance 。
不说里面的具体细节了 ,默认是第一种,不过我一般都改成了第二种,防止快速点击造成的bug,第三种的话是根据需求来的,当然很多情况下可以用其他方法来达到第三种的效果,至于第四种,不推荐使用因为创建一个任务栈还是消耗资源蛮大的。
一般启动activity都需要一个context 而这个context一般都用当前实例(activity)来创造的,谁创造的,新的activity就会跟着进入谁的任务栈,这样因此如果用application的context的话创建activity,就会报错,因为没有任务栈收留他,解决方法是可以setFlag ,添加意向FLAG_ACTIVITY_NEW_TASK 的标记,其实就是新建一个任务栈,说了 这不是一个合适的方法。
关于任务栈的名字 ,可以指定TaskAffinity ,在manifest就可以指定,一般是写成包名,默认就是包名,是一个字符串,你也可以自定义。
另外TaskAffinity跟allowTaskReparenting合起来用的话,有一些特殊的效果,当然这是需要两个app才可以造成的,没有这方面的需求,懒得记了。
关于这个启动模式,代码设置 xml文件设置都可以的,前者的优先级高一点,如果两者都有,肯定按照前者的来。
IntentFilter 过滤列表
他可以设置多个action 如果匹配的时候 只需要匹配上一个就可以了 ,但是如果存在的话,就必须匹配上至少一个 。
也可以设置category 可以有多个category 但是你可以不管他,不匹配他也是可以的。但是你如果想匹配他就必须正确,不然不行。
至于data ,如果设置了,就必须存在,他由两部分组成mimeType 跟URI 。 mimeType指媒体类型
比如xml里面设置了
<intent-filter>
<data android:mimeType="image/*" />
...
那跳转的intent就必须设置了
intent.setDataAndType(Uri.parse("file://abc"),"image/png");
有一点要注意的是 不要写成 setData 跟setType 两者会相互覆盖的
对于一个activity 他可以有多个intentFilter的 只要匹配上一个 就可以了
有一种重要的情况要注意
<action android:name = "android.intent.action.MAIN" />
<category android:name = "android.intent.category.LAUNCHER" />
这是应用的入口 你可以让应用设置多个入口 ,不过一般不会有这种情况