Android finish()自动回调时机,Activity资源释放逻辑放在onDestroy中一定合适吗

首先看Google对finish()的描述,

Call this when your activity is done and should be closed. The
ActivityResult is propagated back to whoever launched you via
onActivityResult().

当activity完成并且应该被关闭的时候,finish()会被回调,在源码中,finish()方法有多处调用,那么在activity的几个生命周期函数中,finish()会在哪个生命周期函数之前或之后呢,下面我们写一段测试代码观察一下。

public class TestActivity extends Activity {

    private static String TAG = "TestActivity";

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        Log.e(TAG, "oncreate time=" + System.currentTimeMillis());
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.e(TAG, "onResume time=" + System.currentTimeMillis());
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.e(TAG, "onStart time=" + System.currentTimeMillis());
    }

    @Override
    protected void onPause() {
        super.onPause();
         Log.e(TAG, "onPause time=" + System.currentTimeMillis());
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.e(TAG, "onStop time=" + System.currentTimeMillis());
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.e(TAG, "onDestroy time=" + System.currentTimeMillis());
    }

    @Override
    public void finish() {
        super.finish();
        Log.e(TAG, "finish time=" + System.currentTimeMillis());
    }
}

代码很简单,操作方法为,进入activity然后按返回键退出,观察log输出发现,finish()在以上几个生命周期函数中,回调的时机位于onResume()和onPause()之间,主动调用finish()方法,顺序同样如此。
下面附上控制台输出:
这里写图片描述

为什么提一下这个?
因为我们平时习惯性的会把一些资源释放和销毁工作放在onDestroy()中进行,但是onDestroy()并不一定是在activity退出时就回被立刻回调,这样反复进入退出activity就有可能出现一些不可预知的错误,比如实际开发中业务逻辑会很多,就可能导致一些资源还没有被释放的情况被再次使用,所以在这种情况下,应该把这些资源释放销毁的动作放到finish()中进行,从而保证activity被频繁创建时不会出问题。

补充:在阿里发布的的阿里巴巴Android开发手册中也提到了这一点,是一个推荐级的说明:

【推荐】不要在 Activity#onDestroy()内执行释放资源的工作,例如一些工作线程的 销毁和停止,因为 onDestroy()执行的时机可能较晚。可根据实际需要,在 Activity#onPause()/onStop()中结合 isFinishing()的判断来执行。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值