- “完成” - 活动从后退栈中移除。 - 它可以由程序触发(例如通过调用
finish()
),或者用户按下返回键(这会隐式调用finish()
)。
- 结束一个活动将销毁它。- “销毁” - Android操作系统可能会销毁一个不可见的活动以回收内存。当用户再次导航到该活动时,该活动将被重新创建。 - 当用户旋转屏幕时,活动将被销毁并重新创建。 - 参考:重新创建活动
那么我应该如何结束一个已销毁的活动呢?finish()
方法需要一个Activity
对象,但如果活动已被销毁,我就没有Activity
对象了 - 我不应该持有对已销毁活动的引用,对吗?
案例研究:
我有一个活动a
,它启动b
,然后启动c
(使用Activity.startActivity()
),现在返回堆栈如下:
a → b → c
在 c 中,用户填写表格并点击提交按钮。使用
AsyncTask
向远程服务器发出网络请求。任务完成后,我会显示一个toast并通过调用c.finish()
结束活动。非常好。
现在考虑这种情况:
在异步任务正在进行时,用户切换到另一个应用程序。然后,由于内存限制,Android操作系统决定销毁所有3个活动( a , b , c )。稍后,异步任务完成了。那么我该如何完成 c ?
我尝试过的:
- Call
c.finish()
:
- Can't, because
c
is destroyed.
- Call
b.finishActivity()
:
- Can't, because
b
is destroyed.
Use Context.startActivity()
with FLAG_ACTIVITY_CLEAR_TOP
so as to raise b
to the top, thus finishing 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);
- Failed,
appContext.startActivity()
throws an exception:
android.util.AndroidRuntimeException: 在Activity上下文之外调用startActivity()需要使用FLAG_ACTIVITY_NEW_TASK标志。这真的是你想要的吗?
编辑:澄清:我需要等待异步任务完成并根据服务器的响应决定是否完成c。
Intent intent = new Intent(appContext, B.class); //B是b的类。 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); finsh(); appContext.startActivity(intent);
- Sree*what*.finish()
?我没有活动。 - Pang