android返回活动时会被销毁并且不会恢复

时间:2011-08-11 14:52:09

标签: android android-actionbar

我正在使用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;    
}

这是一个主要的烦恼,并且大大减慢了应用程序的速度,因为它必须重新加载其数据(缓存,但它不会立即重新加载数据)。

那我怎么能避免这种行为呢?为什么会发生这种情况,因为我相信额外的旗帜应该可以阻止这种行为。

2 个答案:

答案 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?