Android Activity 生命周期处理
Android Activity Lifecycle Handling
我是 android 编程新手,想弄清楚 Activity 生命周期的概念。
为简单起见,我将案例简化如下:
有 2 个活动(MainActivity 和 Main2Activity)。
在MainActivity中创建一个按钮打开Main2Activity。
在 Main2Activity 中,为了模拟用户 return 进入 MainActivity 一旦 Main2Activity 显示,它调用 finish( ) 和 return 到 onCreate() 中的 MainActivity。
点击按钮的时候发现好像出现了race condition
- MainActivity::onCreate() <-- 第一个 MainActivity 实例
- MainActivity::onStart() <-- 第一个 MainActivity 实例
- MainActivity::onResume() <-- 第一个 MainActivity 实例
- MainActivity::onPause() <-- 第一个 MainActivity 实例
- MainActivity::onCreate() <-- 第二个 MainActivity 实例
- MainActivity::onStart() <-- 第二个 MainActivity 实例
- MainActivity::onResume() <-- 第二个 MainActivity 实例
- MainActivity::onStop() <-- 第一个 MainActivity 实例
- MainActivity::onDestroy() <-- 第一个 MainActivity 实例
第一个 MainActivity 实例的最后一个 onDestory() 将 运行 在第二个 MainActivity 实例的 onCreate()、onStart()、onResume() 之后。
如何确保在开始另一个 activity 之前调用 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();
}
不确定它的解决方案,但试一试..
在 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 .. 这将为完成提供足够的时间来调用所有生命周期
您可以在第一个 MainActivity 实例上调用 isFinishing()
。
这是此方法的documentation。
这看起来像:
if (isFinishing()) {
//onDestroy() has not been called yet
}
else {
//onDestroy() has been called already
}
我是 android 编程新手,想弄清楚 Activity 生命周期的概念。
为简单起见,我将案例简化如下:
有 2 个活动(MainActivity 和 Main2Activity)。
在MainActivity中创建一个按钮打开Main2Activity。
在 Main2Activity 中,为了模拟用户 return 进入 MainActivity 一旦 Main2Activity 显示,它调用 finish( ) 和 return 到 onCreate() 中的 MainActivity。
点击按钮的时候发现好像出现了race condition
- MainActivity::onCreate() <-- 第一个 MainActivity 实例
- MainActivity::onStart() <-- 第一个 MainActivity 实例
- MainActivity::onResume() <-- 第一个 MainActivity 实例
- MainActivity::onPause() <-- 第一个 MainActivity 实例
- MainActivity::onCreate() <-- 第二个 MainActivity 实例
- MainActivity::onStart() <-- 第二个 MainActivity 实例
- MainActivity::onResume() <-- 第二个 MainActivity 实例
- MainActivity::onStop() <-- 第一个 MainActivity 实例
- MainActivity::onDestroy() <-- 第一个 MainActivity 实例
第一个 MainActivity 实例的最后一个 onDestory() 将 运行 在第二个 MainActivity 实例的 onCreate()、onStart()、onResume() 之后。
如何确保在开始另一个 activity 之前调用 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();
}
不确定它的解决方案,但试一试..
在 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 .. 这将为完成提供足够的时间来调用所有生命周期
您可以在第一个 MainActivity 实例上调用 isFinishing()
。
这是此方法的documentation。
这看起来像:
if (isFinishing()) {
//onDestroy() has not been called yet
}
else {
//onDestroy() has been called already
}