Pan*_*ang 11 android activity-lifecycle android-activity
据我了解,被销毁的活动并不等同于正在完成的活动.
那么如何完成被破坏的活动呢?该finish()方法需要一个Activity对象,但如果活动被销毁,我没有Activity对象 - 我不应该持有对被破坏活动的引用,是吗?
案例分析:
我有一个活动a,它开始b,然后开始c(使用Activity.startActivity()),所以现在后面的堆栈是:
a ? b ? c
Run Code Online (Sandbox Code Playgroud)
在c,用户填写表单并点击"提交"按钮.使用的远程服务器发出网络请求AsyncTask.任务完成后,我会显示一个祝酒词并通过调用完成活动c.finish().完善.
现在考虑这种情况:
当异步任务正在进行时,用户切换到另一个应用程序.然后,Android操作系统决定销毁所有3个活动(a,b,c)由于存储器约束.之后,异步任务完成.现在我该如何完成c?
我尝试过的:
c.finish():
c被摧毁了.b.finishActivity():
b被摧毁了.使用Context.startActivity()具有FLAG_ACTIVITY_CLEAR_TOP以提高b顶端,从而完成c:
// appContext is an application context, not an activity context (which I don't have)
Intent intent = new Intent(appContext, B.class); // B is b's class.
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
appContext.startActivity(intent);
Run Code Online (Sandbox Code Playgroud)
appContext.startActivity()抛出异常:android.util.AndroidRuntimeException:从Activity上下文外部调用startActivity()需要FLAG_ACTIVITY_NEW_TASK标志.这真的是你想要的吗?
编辑: 澄清:我需要等到异步任务完成,然后c根据服务器的响应决定是否完成.
无法直接完成已销毁的活动,因此只需将finish()其放入其中onCreate()(由@Labeeb P建议)。就是这样:
如果该活动在尝试完成时已被销毁,请在某处保存一个布尔标志。
if(activity != null)
{
// Activity object still valid, so finish() now.
activity.finish();
}
else
{
// Activity is destroyed, so save a flag.
is_activity_pending_finish = true;
}
Run Code Online (Sandbox Code Playgroud)
SharedPreferences(由@Labeeb P建议)。在活动中onCreate(),检查标志并调用finish()。
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
if(is_activity_pending_finish)
{
is_activity_pending_finish = false; // Clear the flag.
// This activity should have been finished, so finish it now.
finish();
return;
}
...
}
Run Code Online (Sandbox Code Playgroud)
调用实际上finish()是onCreate()一个合法的操作,正如文档中提到的:
...您可能会
finish()从内部调用onCreate()来破坏该活动。在这种情况下,系统会立即调用,onDestroy()而不调用任何其他生命周期方法。
其他考虑因素:
当然,被销毁的 Activity 并不一定意味着应用程序处于后台(可能还有另一个前台 Activity)。尽管如此,上述解决方案(调用finish())仍然onCreate()有效。
| 归档时间: |
|
| 查看次数: |
5055 次 |
| 最近记录: |