据我了解,正在销毁的活动并不等同于正在完成的活动。
- 完成的
- 毁坏
- Android 操作系统可能会破坏不可见的活动以恢复内存。当用户导航回活动时,活动将被重新创建。
- 当用户旋转屏幕时,Activity 被销毁并重新创建。
- 参考:重新创建活动
那么我该如何完成一个被破坏的活动呢?该finish()
方法需要一个Activity
对象,但如果活动被破坏,我没有Activity
对象 - 我不应该持有对被破坏活动的引用,是吗?
案例分析:
我有一个活动a
,它开始b
,然后开始c
(使用Activity.startActivity()
),所以现在后面的堆栈是:
a → b → c
在c
中,用户填写表格并点击提交按钮。使用 . 向远程服务器发出网络请求AsyncTask
。任务完成后,我举杯祝酒,并通过调用c.finish()
. 完美的。
现在考虑这种情况:
当异步任务正在进行时,用户切换到另一个应用程序。然后,由于内存限制,Android 操作系统决定销毁所有 3 个活动 ( a
, b
, )。c
稍后,异步任务完成。现在我该如何完成c
?
我试过的:
- 致电
c.finish()
:- 不能,因为
c
被破坏了。
- 不能,因为
- 致电
b.finishActivity()
:- 不能,因为
b
被破坏了。
- 不能,因为
使用
Context.startActivity()
withFLAG_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);
- 失败,
appContext.startActivity()
抛出异常:
- 失败,
android.util.AndroidRuntimeException:从 Activity 上下文外部调用 startActivity() 需要 FLAG_ACTIVITY_NEW_TASK 标志。这真的是你想要的吗?
编辑: 澄清:我需要等到异步任务完成并c
根据服务器的响应决定是否完成。