首先看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()的判断来执行。