Activity关于生命周期的基础知识
2019-06-24 本文已影响0人
冉桓彬
有一些知识点, 时间就不用, 一时半会儿还真不容易记清楚, 这里整理一份笔记, 方便日后快速查阅.
这里只是为了快速记起知识点, 实际还是需要结合源码和demo. 不要死记硬背
目标
(1) Activity启动模式;
(2) 两个Activity相互切换时生命周期的变化;
(3) onStart与onResume、onPause与onStop的区别;
(4) onNewIntent();
(5) 屏幕旋转生命周期的变化;
(6) onSaveInstanceState与onRestoreInstanceState;
(7) Intent之间传值的大小限制;
一、Activity启动模式
1. standard标准模式:
普通模式, 正常启动Activity;
2. singleTop:
如果Activity位于栈顶, 则不重新创建该Activity;
3. singleTask:
移除掉栈中该Activity上面的其他Activity;
4. singleInstance
新开一个栈用来装这些Activity;
二、两个Activity相互切换时生命周期的变化
startActivity(new Intent(MainActivity.this, TestUi.class);
05-01 17:05:24.196 V/AndroidTest: MainActivity:onPause
05-01 17:05:24.206 V/AndroidTest: TestUi:onCreate
05-01 17:05:24.206 V/AndroidTest: TestUi:onStart
05-01 17:05:24.206 V/AndroidTest: TestUi:onResume
05-01 17:05:24.546 V/AndroidTest: MainActivity:onStop
三、onStart与onResume、onPause与onStop的区别
1. onStart: 可见不可点击;
2. onResume: 可见可点击;
3. onPause: 可见不可点击;
4. onStop: 不可见;
四、onNewIntent
1、singleTop: 如果目标Activity位于栈顶, 此时会触发onNewIntent();
2、singleTask/singleInstance: 如果目标Activity在栈中存在, 再次启动时, 触发onNewIntent();
五、屏幕旋转时生命周期的变化
1. 默认情况下: 启动ActivityA, 然后旋转屏幕生命周期变化如下:
V/AndroidTest: MainActivity:onCreate
V/AndroidTest: MainActivity:onStart
V/AndroidTest: MainActivity:onResume
V/AndroidTest: MainActivity:onPause
V/AndroidTest: MainActivity:onStop
V/AndroidTest: MainActivity:onDestroy
V/AndroidTest: MainActivity:onCreate
V/AndroidTest: MainActivity:onStart
V/AndroidTest: MainActivity:onResume
2. 如果在AndroidManifest.xml中进行如下配置:
<activity android:name=".MainActivity"
android:configChanges="keyboardHidden|orientation|screenSize"/>
旋转屏幕时方法调用如下:
V/AndroidTest: MainActivity:onCreate
V/AndroidTest: MainActivity:onStart
V/AndroidTest: MainActivity:onResume
V/AndroidTest: MainActivity:onConfigurationChanged
V/AndroidTest: MainActivity:onConfigurationChanged
六、onSaveInstanceState与onRestoreInstanceState
1、用户每次自动触发back键或者主动调起finish()方法不会触发onSaveInstanceState与onRestoreInstanceState的执行;
2、如果系统由于系统约束而破坏了Activity, 那么尽管实际Activity实例已经消失, 但是系统还是会记住它已经存在, 这样如果用户导航回到它,
系统会创建一个新的实例的Activity使用一组保存的数据来描述Activity在被销毁时的状态.
七、关于Intent传值大小打的限制
关于Intent传值这个问题, 如果要深入到底层找到实际源码出处, 其实不太容易, 这里只从java层触发, 找到关于Intent大小限制的地方;
public class Binder.BinderProxy {
public boolean transact(int code, Parcel data, Parcel reply, int flags) {
// Activity启动时, Intent携带的数据最终被转化到Parcel中, 这里检测data的大小
// 也就是检测Intent携带的数据的大小;
Binder.checkParcel(this, code, data, "Unreasonably large binder buffer");
final boolean tracingEnabled = Binder.isTracingEnabled();
return transactNative(code, data, reply, flags);
}
}
public class Binder {
static void checkParcel(IBinder obj, int code, Parcel parcel, String msg) {
// 大小限制在800kb
if (CHECK_PARCEL_SIZE && parcel.dataSize() >= 800*1024) {
// Trying to send > 800k, this is way too much
StringBuilder sb = new StringBuilder();
sb.append(msg);
sb.append(": on ");
sb.append(obj);
sb.append(" calling ");
sb.append(code);
sb.append(" size ");
sb.append(parcel.dataSize());
sb.append(" (data: ");
parcel.setDataPosition(0);
sb.append(parcel.readInt());
sb.append(", ");
sb.append(parcel.readInt());
sb.append(", ");
sb.append(parcel.readInt());
sb.append(")");
Slog.wtfStack(TAG, sb.toString());
}
}
}