我正在使用Action Bar构建一个包含两个活动的Android应用程序(https://github.com/johannilsson/android-actionbar,因为我的目标是Android 2.2)。
它有许多活动。有一个名为Feed的“Home”活动和另一个名为“Settings”的活动。
我遇到的问题是使用我正在使用的操作栏的示例中给出的createIntent函数,当用户点击主页按钮返回Feed活动时,Activity仍会被销毁而不是恢复。
通过一些调试我发现它被破坏了,而不是当Activity首次暂停和停止时,但是当它恢复请求时。
public static Intent createIntent(Context context)
{
Intent i = new Intent(context, Feed.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
return i;
}
这是一个主要的烦恼,并且大大减慢了应用程序的速度,因为它必须重新加载其数据(缓存,但它不会立即重新加载数据)。
那我怎么能避免这种行为呢?为什么会发生这种情况,因为我相信额外的旗帜应该可以阻止这种行为。
答案 0 :(得分:4)
您想使用:
FLAG_ACTIVITY_REORDER_TO_FRONT
引自Android docs:
如果在传递给Context.startActivity()的Intent中设置,则此标志将为 导致已启动的活动被带到其任务的前端 历史堆栈如果已经在运行。
例如,考虑一项由四项活动组成的任务:A,B,C, D.如果D调用具有解析为的Intent的startActivity() 活动B的组成部分,然后B将被带到前面 历史堆栈,使用此结果顺序:A,C,D,B。此标志将 如果还指定了FLAG_ACTIVITY_CLEAR_TOP,则忽略它。
public static Intent createIntent(Context context)
{
Intent i = new Intent(context, Feed.class);
i.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
return i;
}
答案 1 :(得分:1)
根据哪个类正在启动什么,您可能遇到一个问题,即您的活动的新实例正在启动而旧的实例正在被销毁。这就是文档中关于FLAG_ACTIVITY_CLEAR_TOP
的说法:
如果已设置,并且正在启动的活动已在当前任务中运行,则不会启动该活动的新实例,而是将关闭其上的所有其他活动,并将此Intent传递给(现在在最前面)作为新意图的旧活动。
请注意,它说“如果正在启动的活动已经在当前任务中运行 ...”所以我不确定,但如果您的调试向您展示了这一点,那将是有意义的活动也在被破坏。
调试时,您是否正在查看类对象的“id”数字?在类的onCreate()
和onDestroy()
方法中设置断点,并查看每个类中的类的id。如果它们不同,那么您知道您有两个不同的活动实例。
作为附注/问题,如果ActionBar
在3.0之前无法使用,您如何“定位”2.2?