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()的判斷來執行。