Activity内提供保存方式分为onRetainNonConfigurationInstance(以下称为方式R)和onSaveInstanceState(以下称为方式S)两种;
- 保存数据的方式、类型、限制:
方式S和方式R都是先把数据保存在ActivityClientRecord中。方式 S保存在state字段,为Bundle类型;方式R在lastNonConfigurationInstances字段内的activity字段,为Object类型。
方式R仅在内存中保存,一旦ActivityClientRecord被回收数据就不存在了;方式 S保存的数据(state)会在onStop周期时,通过AIDL的方式传递给ASM保存。同时,这也造成了方式 S保存的数据不能大于(1 * 1024 * 1024) - (4096 * 2) 字节(此大小在ProcessState.cpp中定义: #define BINDER_VM_SIZE ((1 * 1024 * 1024) - (4096 * 2)) )。 - 触发保存数据的时机:
方式R的对应方法会在onDestroy之前根据getNonConfigInstance字段确定是否调用,getNonConfigInstance一般仅在activity执行relaunch操作时为true,暂时未发现有其他情况为true;
方式S的对应方法在不同target sdk version下,所处生命周期不同:
1)target sdk version<11:在onPause前;
2)11<target sdk version<28:在onStop前;
3)target sdk version>=28:在onStop后; - 获取保存的数据
方式S保存的数据可以在onCreate(@Nullable Bundle savedInstanceState)和onRestoreInstanceState(@NotNull Bundle savedInstanceState)两个方法中的savedInstanceState中获取;
方式R保存的数据需要在onResume之前,主动调用getLastNonConfigurationInstance方法获取,onResume之后保存的数据会被清空。
2021-11-09
网友评论