android 临时数据,Android-Activity临时数据的保存

本文详细介绍了如何在Android应用中使用Bundle在Activity的onSaveInstanceState()和onCreate(Bundle savedInstanceState)方法间保存、恢复临时数据,以防止因系统资源限制导致Activity被回收时的用户体验问题。通过模拟Activity被回收并重启的过程,展示了生命周期方法的执行流程和数据持久化的关键步骤。

Activity临时数据的保存是非常重要的,例如:一款小说APP应用,读者使用这款APP看到了223页,用户也没有去记看了多少页;

突然去接了个电话,或者开启的应用程序太多了,可能会导致这款APP应用程序的Activity被系统杀死回收了,当用户打完电话 再次打开这款APP的时候,又从第一页开始了,这样体验非常不好,所以需要去保存Activity的临时数据

在Activity中 onSaveInstanceState(Bundle outState)方法用Bundle保存数据,可以在onCreate(Bundle savedInstanceState)方法用Bundle恢复数据,注意要判断Bundle是否为空

packageliudeli.activity.temp_data;importandroid.app.Activity;importandroid.os.Bundle;importandroid.util.Log;importliudeli.activity.R;public class TempDataActivity extendsActivity {private final String TAG = TempDataActivity.class.getSimpleName();/*** 定义页数变量*/

private intpage;/*** 此方法不仅仅可以初始化数据

* 还可以恢复保存的临时数据

*@paramsavedInstanceState onSaveInstanceState方法 保存的临时数据就存放在Bundle里面*/@Overrideprotected voidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);

setContentView(R.layout.activity_temp_data);//为什么要null判断,因为没有保存临时数据的时候,Bundle是null//所以第一次初始化一定是null

if (null !=savedInstanceState) {

page= savedInstanceState.getInt("page");

Log.d(TAG,"onCreate 上次看到了" + page + "页");

}

Log.d(TAG,"onCreate");

}/*** 例如:当系统内存不足的时候,切换其他游戏应用程序 在玩游戏,有可能当前的Activity会被回收杀死

* 一旦出现回收杀死Activity就会调用此方法,然后在此方法保存临时数据

*@paramoutState*/@Overrideprotected voidonSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);//用户看到223页

page = 223;

outState.putInt("page", page);

}/*** 恢复保存的临时数据

*@paramsavedInstanceState onSaveInstanceState方法 保存的临时数据就存放在Bundle里面*/@Overrideprotected voidonRestoreInstanceState(Bundle savedInstanceState) {super.onRestoreInstanceState(savedInstanceState);//这个方法不需要判断savedInstanceState null,因为不可能为null,只有保存过数据,再次打开Activity才会调用此方法

page = savedInstanceState.getInt("page");

Log.d(TAG,"onRestoreInstanceState 上次看到了" + page + "页");

}/******* 下面是一系列生命周期方法,用来观察,Activity被系统杀死,又重写启动的Log打印 ******/@Overrideprotected voidonStart() {super.onStart();

Log.d(TAG,"onStart");

}

@Overrideprotected voidonResume() {super.onResume();

Log.d(TAG,"onResume");

}

@Overrideprotected voidonPause() {super.onPause();

Log.d(TAG,"onPause");

}

@Overrideprotected voidonStop() {super.onStop();

Log.d(TAG,"onStop");

}

@Overrideprotected voidonDestroy() {super.onDestroy();

Log.d(TAG,"onDestroy");

}

}

如何才能让这个Activity被系统杀死回收呢?

答:如果要测试的话,可以用模拟器 横竖屏切换一下,Activity就被杀死,然后自动重新启动Activity

d10fe356cac6083d77675b77dc96d392.gif

以上图 横竖屏切换后,系统会默认会把Activity杀死回收,所以执行以下方法:

12-12 08:11:50.441 3347-3347/liudeli.activity D/TempDataActivity: onPause

12-12 08:11:50.441 3347-3347/liudeli.activity D/TempDataActivity: onStop

12-12 08:11:50.441 3347-3347/liudeli.activity D/TempDataActivity: onDestroy

系统会自动启动这个Activity,请看下面的Log

12-12 08:11:50.460 3347-3347/liudeli.activity D/TempDataActivity: onCreate 上次看到了223页

12-12 08:11:50.460 3347-3347/liudeli.activity D/TempDataActivity: onCreate

12-12 08:11:50.460 3347-3347/liudeli.activity D/TempDataActivity: onStart

12-12 08:11:50.460 3347-3347/liudeli.activity D/TempDataActivity: onRestoreInstanceState 上次看到了223页

12-12 08:11:50.460 3347-3347/liudeli.activity D/TempDataActivity: onResume

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值