片段活动 - 应用程序死亡,没有保存状态

时间:2013-08-21 18:32:03

标签: android android-fragments android-fragmentactivity

对于极少数用户,我面临着一个非常令人困惑的问题。在Fragment中按下按钮时会发生错误,该按钮会启动另一个Fragment Activity。这是堆栈跟踪:

I/20:22:23.901 ActivityManager( 1668)
Start proc com.brandall.nutter for activity com.brandall.nutter/.ActivityHomeFragment: pid=8956 uid=10125 gids={50125, 3003, 3001, 3002, 1015, 1023, 1006, 1028}
I/20:22:23.881 WindowState( 1668)
WIN DEATH: Window{41ed1948 u0 com.brandall.nutter/com.brandall.nutter.ActivityLinkAppsFragment}
W/20:22:23.881 ActivityManager( 1668)
Force removing ActivityRecord{411c4188 u0 com.brandall.nutter/.ActivityLinkAppsFragment}: app died, no saved state
I/20:22:23.881 WindowState( 1668)
WIN DEATH: Window{41b6a178 u0 Toast EXITING}
W/20:22:23.881 InputDispatcher( 1668)
Attempted to unregister already unregistered input channel '41ed1948 com.brandall.nutter/com.brandall.nutter.ActivityLinkAppsFragment (server)'
W/20:22:23.871 ActivityManager( 1668)
Scheduling restart of crashed service com.brandall.nutter/.TTSS in 80000ms
I/20:22:23.871 ActivityManager( 1668)
Process com.brandall.nutter (pid 8907) has died.
I/20:22:23.871 WindowState( 1668)
WIN DEATH: Window{411d4ff0 u0 com.brandall.nutter/com.brandall.nutter.ActivityHomeFragment}
E/20:22:23.871 InputDispatcher( 1668)
channel '41ed1948 com.brandall.nutter/com.brandall.nutter.ActivityLinkAppsFragment (server)' ~ Channel is unrecoverably broken and will be disposed!
W/20:22:23.871 InputDispatcher( 1668)
channel '41ed1948 com.brandall.nutter/com.brandall.nutter.ActivityLinkAppsFragment (server)' ~ Consumer closed input channel or an error occurred.  events=0x9

由于这一行错误:

com.brandall.nutter/.ActivityLinkAppsFragment}: app died, no saved state

我一直在阅读很多关于片段保存状态的帖子,但似乎没有一个在我的情况下适用,而是在片段跟踪中没有提到的片段本身。其他帖子建议添加到每个片段:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRetainInstance(true);
}

我目前没有覆盖任何片段中的onCreate方法。

我也看到建议将其添加到每个片段中:

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    setUserVisibleHint(true);
}

除了它只发生在极少数用户身上之外,最令人困惑的问题是使用了上下文:

final Intent sa = new Intent(getActivity(), ActivityLinkAppsFragment.class);
getActivity().startActivity(sa);

我的应用程序有一个前台服务,如果我在上面的Intent中使用静态上下文(通过静态getServiceContext()方法),则用户不再出现问题,并且Fragment Activity正确打开。

我不明白为什么使用另一个上下文可以防止问题发生,但我希望通过我提供的信息,它对某人有意义!

我可以提供我正在使用的FragmentPagerAdapter代码,如果它被证明是相关的,但它非常标准。

我提前感谢你

编辑 - 我忘了添加一些非常重要的内容。 这不会导致应用崩溃。相反,Fragment所在的Activity将立即重新启动。

答案 - 这是由于我在用户想要“刷新”应用内存使用量的情况下调用System.exit(0)而导致的。我错了,当用户的设备处理低内存条件时也可以调用它。 @ beworker在下面的答案被标记为正确,正如他所指出的那样ActivityManagerService.handleAppDiedLocked()

1 个答案:

答案 0 :(得分:11)

我查看了堆栈跟踪中消息的Android源代码,发现它来自ActivityManagerService.handleAppDiedLocked()方法。 这种方法的描述说:

  

“由于该过程消失而从活动管理器中删除现有流程的主要功能。清除流程的所有连接。”

当应用程序被杀死时会发生这种情况。它可以被系统,另一个应用程序(例如任务管理器应用程序)或应用程序自行完成(例如System.exit(0))杀死。