【问题标题】:Android Activity Lifecycle HandlingAndroid Activity 生命周期处理
【发布时间】:2019-02-02 06:39:53
【问题描述】:

我是android编程新手,想明确一下Activity Lifecycle的概念。

为简单起见,我将案例缩短如下:

  • 有 2 个活动(MainActivity 和 Main2Activity)。

  • 在 MainActivity 中,会创建一个按钮来打开 Main2Activity。

  • 在 Main2Activity 中,为了模拟用户在 Main2Activity 显示后返回到 MainActivity,它调用了 finish() 并在 onCreate() 中返回到 MainActivity。

当按钮被点击时,我发现似乎出现了竞态条件。

  • MainActivity::onCreate()
  • MainActivity::onStart()
  • MainActivity::onResume()
  • MainActivity::onPause()
  • MainActivity::onCreate()
  • MainActivity::onStart()
  • MainActivity::onResume()
  • MainActivity::onStop()
  • MainActivity::onDestroy()

第一个 MainActivity 实例的最后一个 onDestory() 将在第二个 MainActivity 实例的 onCreate()、onStart()、onResume() 之后运行。

如何确保在开始另一个活动之前调用 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();
}

【问题讨论】:

  • 好问题!
  • 您为什么认为这是个问题? (AFAIK 您对此无能为力,运行时会按照自己的节奏完成/销毁活动。这取决于 Android 版本和硬件以及其他因素,例如当前有多少其他应用正在请求资源)
  • 我打算在activity销毁的时候释放资源。如果在创建同一活动的新实例之前不能保证调用 onDestroy(),它会意外释放正在被另一个实例使用的单例资源。

标签: android android-activity activity-lifecycle


【解决方案1】:

不确定它的解决方案,但试试看..

关于 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 .. 这将为完成提供足够的时间来调用所有生命周期

【讨论】:

  • 使用延时方法似乎不是解决竞态条件的好方法。还是谢谢。
【解决方案2】:

您可以在您的第一个 MainActivity 实例上调用 isFinishing()

这是此方法的documentation

这看起来像:

if (isFinishing()) {
  //onDestroy() has not been called yet
}
else {
  //onDestroy() has been called already
}

【讨论】:

  • 不,这不是isFinishing() 正在检查的内容。阅读您链接到的文档。
  • 谢谢。我将尝试这种方法来检查 onPause() 中的 isFinishing() 值,如果为真则释放资源。
  • @MarcinOrlowski finish() 在这里被显式调用。调用此方法最终会触发onDestroy()。有关详细信息,请参阅此答案:stackoverflow.com/questions/19891969/…
  • isFinishing() 绝不会告诉您是否像您的 cmets 建议的那样调用了 onDestroy()。事实上,如果是这样,那么您的实例已经死了。
猜你喜欢
  • 2016-12-14
  • 2013-04-06
  • 2013-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多