Android Activity 生命周期处理

Posted

技术标签:

【中文标题】Android Activity 生命周期处理【英文标题】:Android Activity Lifecycle Handling 【发布时间】: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(),它会意外释放正在被另一个实例使用的单例资源。 【参考方案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()。有关详细信息,请参阅此答案:***.com/questions/19891969/… isFinishing() 绝不会告诉您是否像您的 cmets 建议的那样调用了 onDestroy()。事实上,如果是这样,那么您的实例已经死了。

以上是关于Android Activity 生命周期处理的主要内容,如果未能解决你的问题,请参考以下文章

[Android]Activity的生命周期

跟着Google学Android —— 3.1 管好Activity的生命周期

Android Activity生命周期解析

Android -- 每日一问:怎么理解 Activity 的生命周期?

Android生命周期绑定

Android四大基本组件介绍与生命周期