Управление жизненным циклом активности Android - PullRequest
0 голосов
/ 27 августа 2018

Я новичок в программировании для Android и хотел бы прояснить концепцию Activity Lifecycle.

Для простоты я сократил регистр, как показано ниже:

  • Есть 2 действия (MainActivity и Main2Activity).

  • В MainActivity создается кнопка для открытия Main2Activity.

  • В Main2Activity для имитации возврата пользователя в MainActivity после отображения Main2Activity вызывается метод finish () и выполняется возврат к MainActivity в onCreate ().

Когда кнопка нажата, я обнаружил, что, похоже, произошло состояние гонки.

  • MainActivity :: onCreate () <- 1-й экземпляр MainActivity </li>
  • MainActivity :: onStart () <- 1-й экземпляр MainActivity </li>
  • MainActivity :: onResume () <- 1-й экземпляр MainActivity </li>
  • MainActivity :: onPause () <- 1-й экземпляр MainActivity </li>
  • MainActivity :: onCreate () <- 2-й экземпляр MainActivity </li>
  • MainActivity :: onStart () <- 2-й экземпляр MainActivity </li>
  • MainActivity :: onResume () <- 2-й экземпляр MainActivity </li>
  • MainActivity :: onStop () <- 1-й экземпляр MainActivity </li>
  • MainActivity :: onDestroy () <- 1-й экземпляр MainActivity </li>

Последний onDestory () из 1-го экземпляра MainActivity будет запускаться после onCreate (), onStart (), onResume () из 2-го экземпляра MainActivity.

Как я могу убедиться, что onDestroy () вызывается перед началом другого действия?

Большое спасибо всем за помощь.


MainActivity.java

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

    final Button btnClick = findViewById(R.id.btnClick);
    btnClick.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // finish self
            finish();
            // start Main2Activity
            Intent intent = new Intent(v.getContext(), Main2Activity.class);
            startActivity(intent);
        }
    });
}

Main2Activity.java

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

    // return to MainActivity
    Intent intent = new Intent(this, MainActivity.class);
    startActivity(intent);
    // finish self
    finish();
}

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Вы можете вызвать isFinishing() на своем первом экземпляре MainActivity.

Вот документация для этого метода.

Это будет выглядеть так:

if (isFinishing()) {
  //onDestroy() has not been called yet
}
else {
  //onDestroy() has been called already
}
0 голосов
/ 27 августа 2018

Не уверен, что это решение, но попробуйте ..

на Main2Activity.java

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

// return to MainActivity

new Handler().postDelayed(new Runnable() {

     @Override
     public void run() {
       Intent intent = new Intent(this, MainActivity.class);    
       startActivity(intent);
     }
},5000);

// finish self
finish();
}

через 5 секунд вызовется startActivity, что даст финишу достаточно времени для вызова всего жизненного цикла

...