应用程序被杀后,savedInstanceState
方法中的onCreate()
包是否存活(非空)?如果可以的话,该捆绑包存储在系统中。
答案 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)