好久没发了,发一篇艺术探索的学习笔记,冒个泡 以前都记在本子上,现在挪到电脑上了 又是一个系列,一个坑 由于是笔记,所以只记录了部分,见谅!~ 不过也加上了自己的一些笔记,所以还是值得一看的
生命周期配对去记忆效果更佳: create — destroy start — stop resume — pause
注意点:
A 启动 B 如果B是透明的Activity,那么A的onStop不会被调用
Activity的销毁与重建涉及到这两方法:
onSaveInstanceState(@Nullable Bundle state)
系统会调用它来保存状态,以便之后恢复onRestoreInstanceState(@NonNull Bundle state)
为系统恢复所用当Activity将处于可能被销毁或要被销毁的状态,就会调用onSaveInstanceState
而onRestoreInstanceState
则是重建的时候被调用
onSaveInstanceState
在onStop
之前调用,而不一定在onPause
之后
onRestoreInstanceState
在onStart
之后,onResume
之前
所以,大致的完整的生命周期是这样的: onCreate onRestart onStart onRestoreInstanceState onResume onPause onSaveInstanceState onStop onDestroy
PS:onSaveInstanceState
如下情况会调用:
另外:可以在onCreate里判断bundle是否为null来判断是新建还是重新创建
A系统默认做了一定的恢复,如视图结构,LV的滑动的位置等等(View也有save,restore方法)
> PS 看到有的文章说解决Fragment重叠的问题,就是注释掉Activity的onSaveInstanceState方法,简直是误人子弟!!!有机会以后讲
扯远了,保存和恢复View的层次结构,系统的工作流程是这样子的: Activity⇒Window⇒DecorView⇒ContentView⇒View 一层一层委托保存恢复状态
Configuration改变的时候系统默认会重建Activity,如果我不想重建,那么可以选择配置android:configChanges
属性,一般常用的就orientation
,screenSize
,keyboardHidden
so,一般给Activity配上这个就行了:
android:configChanges="orientation|screenSize|keyboardHidden"
标准模式,默认的启动模式,每次启动都会新建一个Activity实例
需要注意的是当使用ApplicationContext去启动Standard模式的Activity的时候会报错,说需要添加NEW_TASK 的标记
为什么呢?
因为Activity启动需要任务栈,而用Standard模式去启动Activity,默认会进入启动它的Activity所属的任务栈中,而非Activity类型的Context并没有所谓的任务栈.
ABC—启动C->ABC
栈顶复用模式,如果新的Activity已位于栈顶,那么不会重新创建Activity,而是回调onNewIntent
方法
onNewIntent-->onResume
ABC—启动C→ ABC
栈内复用模式,只要占中存在都不会重新创建,并且也是回调onNewIntent
另外需要注意的是,该模式拥有clearTop 的效果,会把位于它顶上的Activity全部出栈(PS:必须同一个栈)
如: ABCDE—启动C(SingleTask)→ ABC
单实例模式,栈内单例,一个Activity实例独占一个任务栈,可以说整个手机都只有一个实例
指定启动模式有两种方式:
android:launchMode
属性常用的Flags:
singleTask
singleTop
启动模式FLAG_ACTIVITY_NEW_TASK
一起出现android:exludeFromRecents="true"
TaskAffinity(任务相关性),标识了一个Activity的任务栈名称,默认为应用的包名(万能的包名啊!)
我们可以在清单文件里配置,也可以为每个Activity配置不同的值,但是需要注意的是它不能跟包名相同,并且必须要包含.
分隔符!
并且TaskAffinity属性主要和SingleTask
或者allowTaskReparenting
配对使用,在其他情况下没有意义.
allowTaskReparenting
配合就比较复杂了:
当allowTaskReparenting
为true
时,A应用启动B应用的一个Activity C,然后按Home回到桌面,然后再单击B的桌面图标,这个时候不是启动B的主Activity,而是重新显示被应用A启动的Activity C(原本来说C是A启动的,那么C应该待在A的任务栈里),或者说C从A的任务栈转移到了B的任务栈中(也许这就是re-parenting的含义吧)补充:allowTaskReparenting
需要和FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
标记合作才行,而从Home点击图标启动应用的Intent
就带有该标记.
预告下一篇应该是 IntentFilter的匹配规则,为什么不放一起呢?
一来是字数太多,二来是我还没打完...
EJ系列的坑还没填完,我又开了一个坑...
我都想打死我自己
关注我,看我把坑填完!