1. 程式人生 > >Android finish()自動回撥時機,Activity資源釋放邏輯放在onDestroy中一定合適嗎

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