Activity关于生命周期的基础知识

有一些知识点, 时间就不用, 一时半会儿还真不容易记清楚, 这里整理一份笔记, 方便日后快速查阅.
这里只是为了快速记起知识点, 实际还是需要结合源码和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中进行如下配置:
   
  旋转屏幕时方法调用如下:
   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());
        }
    }
}

你可能感兴趣的:(Activity关于生命周期的基础知识)