在应用程序被杀之后,'Bundle savedInstanceState'是否会存活?

时间:2013-05-30 13:30:17

标签: android

应用程序被杀后,savedInstanceState方法中的onCreate()包是否存活(非空)?如果可以的话,该捆绑包存储在系统中。

3 个答案:

答案 0 :(得分:16)

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

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

答案 1 :(得分:7)

不,它不会,Android应用程序只要它正在运行就维持它的状态:(前景和背景)。

如果您正在寻找能够跨越应用程序的不同生命周期的东西,请使用像SharedPreferences这样的东西。

关于

  

如果系统终止您的申请流程并且用户导航回您的活动

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

android文档:

  

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

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

因此您不应期望始终维护InstanceState。 Activity source code at codegrep

修改

通过搜索谷歌android instance state我来到此资源Android Recreating an Activity

  

当您的活动因用户按下Back或活动自行完成而被销毁时,该Activity实例的系统概念将永远消失,因为该行为表明不再需要该活动。但是,如果系统由于系统约束(而不是正常的应用程序行为)而破坏活动,那么虽然实际的Activity实例已经消失,但系统会记住它存在,如果用户导航回它,系统会创建一个新的活动的实例,使用一组保存的数据来描述销毁时的活动状态。系统用于恢复先前状态的已保存数据称为"实例状态"并且是存储在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();
}

只要 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;
    }
   .....

答案 2 :(得分:2)

来自其中一个Android培训材料的下表可能会更有帮助。

其中,bundle update rails 保存的捆绑包在应用为OPEN时有效,这意味着该应用可能会被暂停,甚至停止和破坏(由于轮换等原因)但使用后退按钮不退出。 / p>

如果不是onSavedInstanceState,该表还会显示其他可用选项。

enter image description here