bra*_*all 12 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
Run Code Online (Sandbox Code Playgroud)
由于这一行错误:
com.brandall.nutter/.ActivityLinkAppsFragment}: app died, no saved state
Run Code Online (Sandbox Code Playgroud)
我一直在阅读很多关于片段保存状态的帖子,但似乎没有一个在我的情况下适用,而是在片段跟踪中没有提到的片段本身.其他帖子建议添加到每个片段:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
Run Code Online (Sandbox Code Playgroud)
我目前没有覆盖任何片段中的onCreate方法.
我也看到建议将其添加到每个片段:
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
setUserVisibleHint(true);
}
Run Code Online (Sandbox Code Playgroud)
除了它只发生在极少数用户的事实之外,最令人困惑的问题是使用了Context:
final Intent sa = new Intent(getActivity(), ActivityLinkAppsFragment.class);
getActivity().startActivity(sa);
Run Code Online (Sandbox Code Playgroud)
我的应用程序有一个前台服务,如果我在上面的Intent中使用静态上下文(通过静态getServiceContext()方法),则用户不再出现问题,并且Fragment Activity正确打开.
我不明白为什么使用另一个Context会阻止问题的发生,但我希望有了我提供的信息,这对某人有意义!
如果它被证明是相关的,我可以提供我正在使用的FragmentPagerAdapter代码,但它非常标准.
我提前谢谢你
编辑 - 我忘了补充一些非常重要的东西.这不会导致应用程序崩溃.相反,Fragment所在的Activity将立即重新启动.
答案 - 这是由于我System.exit(0)
在我认为只有当用户想要"刷新"应用程序的内存使用情况时才会调用的情况.我错了,当用户的设备处理低内存条件时也可以调用它.@ beworker在下面的回答被标记为正确,正如他所指出的那样ActivityManagerService.handleAppDiedLocked()
是由此造成的.
ser*_*nka 11
我通过Android源代码查看了堆栈跟踪中的消息,发现它来自ActivityManagerService.handleAppDiedLocked()
方法.这种方法的描述说:
"由于该过程消失,从活动管理器中删除现有流程的主要功能.清除流程的所有连接."
这会在应用程序被杀死时发生.它可以被系统,另一个应用程序(例如任务管理器应用程序)杀死,或者当应用程序自己完成时(例如System.exit(0)
).
归档时间: |
|
查看次数: |
13923 次 |
最近记录: |