15

savedInstanceState应用程序被杀死后,方法中的捆绑包onCreate()是否还活着(不为空)?如果可以,此捆绑包在系统中的存储位置。

4

4 回答 4

21

如果 Android 终止托管您的应用程序的进程,它仍会保持所有活动(未完成)活动的“已保存实例状态”。此数据由ActivityManager. 如果用户返回到您的应用程序,Android 将为该应用程序创建一个新进程,Application再次实例化该实例,然后在活动堆栈中创建一个顶部活动的实例。然后它将调用onCreate()该活动实例,将最近为该活动保存的“已保存实例状态”传递给它。

如果您重新启动手机,所有这些数据都会丢失(Android 不会在重新启动后保存应用程序状态)。

于 2013-06-04T20:54:39.467 回答
7

不,它不会,只要它正在运行,android应用程序就会保持它的状态:(前台和后台)。

如果您正在寻找可以跨越应用程序不同生命周期的东西,请使用 SharedPreferences 之类的东西。

关于

如果系统终止了您的应用程序进程并且用户导航回您的活动

这只发生在 android 需要内存并且必须终止您的活动以释放资源和活动堆栈中的活动时。它记录了这是一种维护用户体验的便捷方式。

安卓文档:

后台活动(对用户不可见且已暂停的活动)不再重要,因此系统可以安全地终止其进程以回收其他前台或可见进程的内存。如果它的进程需要被杀死,当用户导航回活动(使其再次在屏幕上可见)时,它的 onCreate(android.os.Bundle) 方法将被调用它之前在 onSaveInstanceState(android .os.Bundle)

这样它就可以在与用户上次离开时​​相同的状态下重新启动。

所以你不应该期望 InstanceState 一直保持不变。 codegrep 上的活动源代码

编辑

通过在谷歌上搜索android instance state我来自这个资源Android Recreating an Activity

当您的 Activity 因用户按下 Back 或 Activity 自行结束而被销毁时,系统对该 Activity 实例的概念将永远消失,因为该行为表明不再需要该 Activity。但是,如果系统由于系统约束(而不是正常的应用程序行为)而破坏了 Activity,那么虽然实际的 Activity 实例已经消失,但系统会记住它的存在,因此如果用户导航回它,系统会创建一个新的使用一组保存的数据来描述活动被销毁时的状态的活动实例。系统用来恢复之前状态的保存数据称为“实例状态”,是存储在 Bundle 对象中的键值对的集合。

编辑 2 在挖掘了 android 内部之后,似乎都是关于ActivityManagerNative

每当一个活动暂停时,它的状态就会使用包裹对象传递给 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();
}

每当ActivityManagerNative创建一个活动时,它都会使用 Parcel 将该状态传递回活动

    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;
    }
   .....
于 2013-05-30T13:32:41.230 回答
4

来自 Android 培训材料之一的下表可能更有帮助。

其中,保存的捆绑包onSavedInstanceState在应用程序打开时有效,这意味着应用程序可能会暂停甚至停止和销毁(由于旋转等原因),但不能使用后退按钮退出。

如果没有,该表还显示了其他可用选项onSavedInstanceState

在此处输入图像描述

于 2017-05-02T05:37:04.567 回答
1

这里的答案有点过时了。在 2021 年,savedInstanceState它会在设备重新启动时保持不变,因为它会被写入磁盘,并且将onCreate在再次创建活动时可用

官方文档状态

Saved instance state bundles persist through both configuration changes and process death because onSavedInstanceState() serializes data to disk

链接到文档

于 2021-05-22T12:20:44.117 回答