【问题标题】:Corrupt Android savedInstanceState损坏的Android savedInstanceState
【发布时间】: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


    【解决方案1】:

    这里已经回答了: Fragment did not create a view

    字面意思是:

    你需要扭转这个:

    setContentView(R.layout.main_activity); 
    super.onCreate(savedInstanceState). 
    

    进入这个:

    super.onCreate(savedInstanceState). 
    setContentView(R.layout.main_activity);
    

    在您的活动的onCreate

    【讨论】:

    • 对不起,我应该提到我看了那个问题,在我的 NavigationPage 中,代码是:super.onCreate(savedInstanceState); setContentView(R.layout.navigation);
    • 我也很不高兴地看了这个帖子:stackoverflow.com/questions/19874882/…
    • onSaveInstanceState 方法呢?也许它也在保存一个空值?
    • 不,我通过调试转储了 Bundle,看到:08-25 17:15:38.205 22849-22849/? D/com.foo.NavigationPage﹕android:viewHierarchyState 是捆绑包中的一个键 08-25 17:15:38.205 22849-22849/? D/com.foo.NavigationPage﹕键 [0], 值 [android.view.AbsSavedState$1@483fabc] 08-25 17:15:38.205 22849-22849/? D/com.foo..NavigationPage﹕键 [1], 值 [android.view.AbsSavedState$1@483fabc] 08-25 17:15:38.205 22849-22849/? D/com.foo..NavigationPage﹕键 [2], 值 [android.view.AbsSavedState$1@483fabc] ...
    猜你喜欢
    • 1970-01-01
    • 2019-04-01
    • 2021-01-18
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    • 2014-07-16
    • 1970-01-01
    • 2023-03-19
    相关资源
    最近更新 更多