onCreate()
方法中的savedInstanceState
捆绑包在应用程序被杀死后是否仍然存在(非null)?如果是的话,这个捆绑包存储在系统中的哪里。
onCreate()
方法中的savedInstanceState
捆绑包在应用程序被杀死后是否仍然存在(非null)?如果是的话,这个捆绑包存储在系统中的哪里。
ActivityManager
存储。如果用户返回您的应用程序,Android将为该应用程序创建一个新进程,再次实例化Application
实例,然后创建一个活动堆栈中的顶部活动实例。然后,它将调用那个活动实例上的onCreate()
,并传递最近为该活动保存的“保存实例状态”。因此,您不应期望InstanceState始终保持。
编辑
通过搜索google的android instance state
,我找到了这个资源Android重新创建Activity
当用户按下Back键或Activity自行完成时,系统会销毁您的Activity。这意味着该Activity实例的系统概念将永远消失,因为行为表明不再需要该Activity。但是,如果系统由于系统限制(而不是正常应用程序行为)而销毁Activity,则尽管实际Activity实例已经消失,系统仍会记住它的存在,以便如果用户导航回到该Activity,则使用一组保存的数据创建Activity的新实例,描述了Activity被销毁时的状态。系统用于恢复先前状态的保存数据称为“instance state”,是存储在Bundle对象中的一组键值对集合。
编辑2 在深入研究Android内部后,似乎一切都与ActivityManagerNative有关。
每当一个活动暂停时,它的状态都会使用Parcel对象传递到ActivityManager进程中。
public void activityPaused(IBinder token, Bundle state) throws RemoteException
{
Parcel data = Parcel.obtain();
Parcel reply = Parcel.obtain();
data.writeInterfaceToken(IActivityManager.descriptor);
data.writeStrongBinder(token);
data.writeBundle(state);
mRemote.transact(ACTIVITY_PAUSED_TRANSACTION, data, reply, 0);
reply.readException();
data.recycle();
reply.recycle();
}
public boolean onTransact(int code, Parcel data, Parcel reply, int flags)
throws RemoteException {
switch (code) {
case START_ACTIVITY_TRANSACTION:
{
data.enforceInterface(IActivityManager.descriptor);
IBinder b = data.readStrongBinder();
IApplicationThread app = ApplicationThreadNative.asInterface(b);
Intent intent = Intent.CREATOR.createFromParcel(data);
String resolvedType = data.readString();
Uri[] grantedUriPermissions = data.createTypedArray(Uri.CREATOR);
int grantedMode = data.readInt();
IBinder resultTo = data.readStrongBinder();
String resultWho = data.readString();
int requestCode = data.readInt();
boolean onlyIfNeeded = data.readInt() != 0;
boolean debug = data.readInt() != 0;
int result = startActivity(app, intent, resolvedType,
grantedUriPermissions, grantedMode, resultTo, resultWho,
requestCode, onlyIfNeeded, debug);
reply.writeNoException();
reply.writeInt(result);
return true;
}
.....
savedInstanceState
会被写入磁盘并在再次创建活动时在onCreate
中可用,因此会跨设备重启保留。onSavedInstanceState()
将数据序列化到磁盘上,所以保存的实例状态包会通过配置更改和进程死亡而持久化。
文档链接
savedInstanceState
会在进程死亡后保留,但是在我的测试中并没有这样。你可以通过点击顶部工具栏上的红色按钮来模拟进程死亡onSaveInstanceState
捆绑包可能不会被销毁,但是当我们手动终止进程时,它可能会被销毁。你可以阅读更多这里
savedInstanceState
设置为 persistableMode 时,它可以在重新启动后仍然存在。该Bundle
将会作为第二个参数传递到 onCreate(Bundle, PersistableBundle) 方法中。 - passsyonSaveInstanceState',它带有
PersistableBundle作为额外参数。如果你想知道为什么你的
onSaveInstanceState`没有被调用,可能是因为你正在使用这个新方法。 - Burak Dede