将savedInstanceState在捆绑onCreate()方法应用后还活着(NOT NULL)是被杀害?如果可以的话,该捆绑包存储在系统中.
Dav*_*ser 15
如果Android杀死托管您应用的进程,它仍会维护所有活动(未完成)活动的"已保存实例状态".这些数据由...存储ActivityManager.如果用户返回到您的应用程序,Android将为该应用程序创建一个新进程,Application再次实例化该实例,然后在活动堆栈中创建一个顶级活动的实例.然后,它将调用onCreate()该活动实例,向其传递最近为该活动保存的"已保存实例状态".
如果重新启动手机,则所有这些数据都将丢失(Android不会在重新启动后保存应用程序状态).
不,它不会,Android应用程序维持它的状态,只要它运行:(前景和背景).
如果你正在寻找可以跨越应用程序的不同生命周期的东西使用像SharedPreferences这样的东西.
关于
如果系统终止您的申请流程并且用户导航回您的活动
这只发生在android需要内存并且必须终止你的活动以释放活动堆栈中的资源和活动时.它记录了它是一种维护用户体验的便利方式.
android文档:
后台活动(用户不可见且已暂停的活动)不再重要,因此系统可以安全地终止其进程以回收其他前台或可见进程的内存.如果需要杀死它的进程,当用户导航回活动(再次在屏幕上显示)时,将使用之前在onSaveInstanceState中提供的savedInstanceState调用其onCreate(android.os.Bundle)方法(android .os.Bundle)
这样它就可以在用户最后离开它的状态下重新启动它.
所以你不应该期望一直维护InstanceState. codegrep上的活动源代码
编辑
通过搜索谷歌android instance state我来自这个资源Android重新创建活动
当您的活动因用户按下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();
}
Run Code Online (Sandbox Code Playgroud)
每当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;
}
.....
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5217 次 |
| 最近记录: |