Activity异常情况下生命周期分析

本文探讨了Android中Activity的生命周期管理,包括系统资源不足时Activity被回收的情况及其优先级排序,并介绍了如何通过onSaveInstanceState和onRestoreInstanceState方法保存及恢复状态。此外还讨论了配置改变(如屏幕旋转)导致Activity重建的问题及解决方案。

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

主要分析两种情况:

1 系统资源不足导致优先级低的Activity被回收。

Activity优先级排序:前台可见>前台可见不可交互(前台activity弹出dialog)>后台(用户按下home键、切换到其他应用)

当前台activity被回收,系统处于要奔溃状态,前台可见但不可交互状态下的activity一般情况也不会回收。Activity被系统回收,如果需要保存一些现场数据和再次被用户打开恢复,可借助onSaveInstanceState(Bundle outState)保存数据,onRestoreInstanceState(Bundle savedInstanceState) 恢复数据。虽然可以 onCreate(Bundle savedInstanceState)种对savedInstanceState进行非空判断进行数据恢复,但谷歌更推荐onRestoreInstanceState(Bundle savedInstanceState) 。

代码如下:

public class MainActivity extends AppCompatActivity {
    private EditText testEt;
    private String test;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        testEt= (EditText) findViewById(R.id.test);
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        test=testEt.getText().toString();
        outState.putString("test",test);
    }


    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        testEt.setText(savedInstanceState.getString("test","default"));
    }

2 由于资源相关配置发生改变导致Activity被杀死和重新创建,比如屏幕发生旋转。使用上述的方法也可以很好的保存和恢复数据。也可以指定configChanges避免由于配置改变导致重建。 android:configChanges="orientation|screenSize",当该activity发生屏幕旋转,activity不会被系统杀死和重建,会回调onConfigurationChanged。当配置程序需要响应配置改变,指定configChanges属性,重写onConfigurationChanged方法即可。

 @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        Toast.makeText(MainActivity.this,"屏幕旋转",Toast.LENGTH_SHORT).show();
    }





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值