【发布时间】:2015-08-25 21:21:22
【问题描述】:
场景是这样的,我的 Android 应用程序通过用户点击主页按钮放置在后台,接听来电,点击通知等。所以,他们看 Facebook,玩 Asphalt 8,任何会导致Android 操作系统发现它需要更多内存并杀死我的 Android 应用程序。用户决定他们想要回顾我的应用,点击图标并 BOINK!
当应用程序在被操作系统杀死后启动时,主 Activity 会传递一个包含两个键的 savedInstanceState:android:viewHierarchyState 和 android:support:fragments。这个 savedInstanceState 被传递给 Fragment,它崩溃了,说明 Fragment 没有创建视图:
Caused by: java.lang.IllegalStateException: Fragment com.foo.SomeFragment did not create a view.
at android.support.v4.app.FragmentManagerImpl.onCreateView(FragmentManager.java:2200)
at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:300)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:727)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:806)
at android.view.LayoutInflater.inflate(LayoutInflater.java:504)
at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
at android.view.LayoutInflater.inflate(LayoutInflater.java:365)
at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:404)
at android.app.Activity.setContentView(Activity.java:2156)
at com.foo.NavigationPage.onCreate(NavigationPage.java:774)
at android.app.Activity.performCreate(Activity.java:5958)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1129)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2474)
at android.app.ActivityThread.access$800(ActivityThread.java:144)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1359)
....
因此,操作系统在杀死应用程序时正在使用它写入 savedInstanceState 的数据,但由于某种原因,当应用程序在启动时使用它来创建自身时,它已损坏。
我已尝试在 NavigationPage 活动中执行此操作:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(null)
}
这适用于移动应用程序启动,但如果您的移动应用程序进入后台并点击图标,您预计它会回到您离开的位置。传递 null 会导致应用程序完成其所有屏幕构建/加载过程,这很耗时,而不是我们想要的用户体验。
对可能发生的情况或如何避免这种情况有任何想法?
【问题讨论】:
标签: android android-fragments savestate