小白成长记——Android基础之Activity临时数据缓存

当Android系统因资源不足等原因回收Activity时,如何保存和恢复临时数据和状态?本文通过onSaveInstanceState和onRestoreInstanceState回调,阐述如何在Activity可能被销毁时保存数据,并在重新创建时恢复,涉及按Home键、菜单键、锁屏、跳转和横竖屏切换等场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

单看标题可能不是很明确我要说的到底是什么,不如具体举一个场景的例子来说明

假设现在有两个Activity A跟B,当我们从A进入B一段时间后,由于内存资源不足等原因,系统可能会自动把activity A给回收了,这时我们按下back键想回到activity A,那么activity A执行的就不是onRestart方法,而是onCreate方法重新创建一次,这样的话我们之前A中的一些临时数据或者状态信息等可能就会丢失

那么,我们该如何对这些临时数据和状态进行保存呢?

Activity中提供了onSaveInstanceState回调方法,我们可以通过它保存临时数据和状态,方法中有一个Bundle参数,可以通过它的putString()、putInt()等方法传入需要保存的临时数据和状态。数据保存之后会在onCreate中恢复,onCreate也有一个Bundle类型的参数,通过它获取缓存下来的数据。

具体实现:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //当Acivity第一次被创建的时候为空,为了防止空指针,这里做判断
        if( savedInstanceState != null ){
            savedInstanceState.getString("data");
        }
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putString("data","test data");
    }

对于onSaveInstanceState方法,我们说它是在activity可能会被销毁的情况下被调用,那么具体哪些情况算是activity可能会被销毁呢?

1.按Home键,系统不确定按Hone键之后用户的其他操作是否会导致资源占用等问题从而使activity被销毁,所以调用onSaveInstanceState方法以防万一

2.按菜单键选择运行其他程序,原因与上一条差不多

3.按电源键锁屏

4.从当前activity跳转到一个新的activity

5.横竖屏切换,横竖屏切换时activity会销毁然后重新创建

总之,那些未经用户许可,而是由系统自动回收的activity都会在销毁前调用onSaveInstanceState方法对数据、状态进行缓存

onSaveInstanceState具体是在onStop方法之前调用,不确定是在onPause之前还是之后

当然如果是用户手动的进行activity的销毁,那么onSaveInstanceState方法就不会被调用,所以onSaveInstanceState的调用具有不确定性,所以我们不应该在该方法中进行一些永久性数据的保存,而应该放在onDestroy方法中

其实,activity还提供了onRestoreInstanceState回掉方法,它也有一个Bundle参数,作用就是用来恢复onSaveInstanceState中缓存的临时数据,但它与onSaveInstanceState不一定是成对出现的,只有activity真正的被系统销毁了它才会被调用,而且是在onStart方法后被调用

所以我们可以选择在onCreate方法或者onRestoreInstanceState方法中进行临时数据和状态的恢复。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值