nak*_*ive 5 android onresume activity-finish
我有三个活动,我们称之为一,二,三.从活动ONE开始,按钮按下开始活动TWO.从活动TWO开始,按钮开始活动三.
很简单.
现在,活动THREE需要从应用程序访问一些数据(可能存在也可能不存在).在THREE的onResume()方法中,检查数据,如果不存在则活动结束,如下所示:
@Override
protected void onResume() {
super.onResume();
/* ... get data from app ... */
if (data == null) {
Toast.makeText(this, "Data not found", Toast.LENGTH_SHORT).show();
finish();
return;
}
/* ... other logic ... */
}
Run Code Online (Sandbox Code Playgroud)
当data == null三,完成,摧毁并返回到TWO.一切都很好.现在在TWO中,按后退按钮调用finish()TWO,但TWO从不调用onDestroy().用户返回到ONE就好了,但是任何后续返回TWO的意图都不起作用并且不会抛出任何错误.TWO处于完成(并暂停)的状态,但从未被破坏,因此无法恢复.
那么,为什么在这种情况下三重要?如果我删除finish()上面代码块中的调用,并依赖于"自然"完成三个(通过使用后退按钮),当用户返回到ONE时,TWO已被正确销毁.
好吧,这里真的让人感到困惑......
保持finish()呼叫到位,我可以通过直接从ONE启动THREE来缓解挂断,然后"自然地"完成它(后退按钮).在THREE被销毁(第二次)之后,TWO按预期打开.
我读过的一切都已经说我应该是确定通话finish()中onResume()的一项活动.但在这种情况下,它会使某些状态处于不良状态,并阻止我破坏呼叫活动.
想法?还是我把你的大脑翻了个遍?
编辑:
进一步的探索发现了这颗宝石......
finish()使用postDelay()大约500毫米的处理程序在THREE 周围调用将允许TWO按预期关闭.像这样:
@Override
protected void onResume() {
super.onResume();
/* ... get data from app ... */
if (data == null) {
Toast.makeText(this, "Data not found", Toast.LENGTH_SHORT).show();
Handler h = new Handler();
h.postDelayed(new Runnable() {
@Override
public void run() {
finish();
}
}, 500);
return;
}
/* ... other logic ... */
}
Run Code Online (Sandbox Code Playgroud)
不完全是我的修复想法......
| 归档时间: |
|
| 查看次数: |
9742 次 |
| 最近记录: |