Android 生命周期学习

在我们日常的Android项目开发中,经常涉及到数据的存储与读取,那么我们一般是将一些轻量级的数据在onPause或onStop时存储起来。那么作为初学者很容易犯的一个错误便是容易混淆存储在这两个位置的区别。

那么有如下的情景,Activity A 中对单例模式下的封装类的某一个属性做了修改(这里拿自定义的Application作为测试封装类):

//自定义Application中有如下代码

private boolean testGate = false;

    public boolean getTestGate() {
        return testGate;
    }

    public void setTestGate(boolean testGate) {
        this.testGate = testGate;
    }


//Activity A中有如下代码
···
drawsomeApp = DrawsomeApplication.getApplicationInstance();
···
@Override
    protected void onStop() {
        super.onStop();
        drawsomeApp.setTestGate(true);
    }

这时直接跳转到Activity B中有如下代码:

private Button btShowGate;

@Override
    protected void onCreate() {
    ···
    if(drawsomeApp.getTestGate){
        //TODO SOMETING
        Toast.makeText(this,"show result"+ drawsomeApp.getTestGate(),Toast.LENGTH_LONG);
    }
    ···
    btShowGate.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                showGate();
            }
        });
    ···
    }
    private void showGate(){
        Toast.makeText(this,"show result"+ drawsomeApp.getTestGate(),Toast.LENGTH_LONG);
    }

那么此时我们进入B界面并不会看到Toast的显示。但通过点击却发现所显示到值为true。那么为什么会出现这样的问题?

典型情况下的生命周期

我们知道典型情况下Activity的生命周期中存在7种方法:

  • onCreate()
  • onRestart()
  • onStart()
  • onResume()
  • onPause()
  • onStop()
  • onDestory()

那么请思考如下问题

假设当前Activity为A,如果这是用户打开一个新的Activity B,那么B的onResume()和A的onStop()方法哪个先执行呢? –《Android 开发艺术探索》

这个问题可以从Android 源码中得到解释,在新的Activity启动之前位于栈顶的Activity需要先执行onPause()方法,执行完毕后会依次执行新Activity的onCreate()、onStart()、onResume()方法,最后在执行旧Activity中的onStop()方法。这样也就解释了我们在文章最开始时提出的情景中所遇到的问题,同时也解释了为何不在onPause()中做耗时操作的原因。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值