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 生命周期处理的主要内容,如果未能解决你的问题,请参考以下文章
跟着Google学Android —— 3.1 管好Activity的生命周期