1. 程式人生 > >Activity上有Dialog的時候按Home鍵時的生命週期

Activity上有Dialog的時候按Home鍵時的生命週期

        對於學習Android的朋友來說Activity的7個生命週期肯定不陌生,但是有些極端情況對於剛接觸Android的朋友們來說分析生命週期可能就有些困難。問題如題,下來我們就結合結果來分析一下整個過程。

        如下為我們邏輯的程式碼其實就是一個按鈕的監聽,當點選事件觸發的時候出現一個不可取消的AlertDialog元件,之後我們重寫各個生命週期觸發的方法並且列印日誌:

public class MainActivity extends AppCompatActivity {

    private Button button;
    private String TAG = "MainActivity";

    public void init(){
        button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AlertDialog dialog = new AlertDialog.Builder(MainActivity.this)
                        .setIcon(R.mipmap.ic_launcher_round)
                        .setCancelable(false)
                        .setMessage("Error")
                        .setTitle("Warring")
                        .show();
            }
        });
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
    }

    protected void onStart(){
        Log.d(TAG,"onStart方法正在執行");
        super.onStart();
    }

    protected void onResume(){
        Log.d(TAG,"onResume方法正在執行");
        super.onResume();
    }

    protected void onPause(){
        Log.d(TAG,"onPause方法正在執行");
        super.onPause();
    }

    protected void onStop(){
        Log.d(TAG,"onStop方法正在執行");
        super.onStop();
    }

    protected void onDestroy(){
        Log.d(TAG,"onDestroy方法正在執行");
        super.onDestroy();
    }
}

        我們點選按鈕之後得到如下結果:        


         我們看到程式的生命週期是:onCreate() -> onStart() -> onResume -> onPause() -> onStop() 

         其實就是一個很正常的Activity生命週期,並沒有什麼特別的地方,但是注意onPause方法和onStop方法是在我點選Home鍵之後才有的,這就說明對話方塊的出現並沒有使Activity進入後臺。而是點選Home鍵才使Activity進入後臺工作。

         問題就在這裡,我開始的疑問是:明明我沒有辦法對Activity的其他部件進行操作了為什麼Activity沒有進入後臺,這裡就要注意。我們彈出的AlertDialog對話方塊實際上是Activity的一個元件,我們對Activity並不是不可見而是被一個佈滿螢幕的元件覆蓋掉了其他元件,所以我們無法對其他內容進行操作,也就是AlertDialog實際上是一個佈滿全屏的元件。

         當我們點選了Home鍵後Activity才真正地進入後臺工作,其實也就是我們看到的正常的Activity執行時點選Home鍵時的生存週期,只是我們被AlertDialog這個元件所迷惑。