一開始谷歌找遍了全網 , 直接搜這個報錯貌似沒有解決方法 T_T
希望這篇文章能夠幫到各位啦.
解決方法拉到文末.
報錯日誌:
E/Parcel: Class not found when unmarshalling: android.support.v4.app.FragmentManagerState
java.lang.ClassNotFoundException: android.support.v4.app.FragmentManagerState
at java.lang.Class.classForName(Native Method)
at java.lang.Class.forName(Class.java:309)
at android.os.Parcel.readParcelableCreator(Parcel.java:2281)
at android.os.Parcel.readParcelable(Parcel.java:2245)
at android.os.Parcel.readValue(Parcel.java:2152)
at android.os.Parcel.readArrayMapInternal(Parcel.java:2485)
at android.os.BaseBundle.unparcel(BaseBundle.java:221)
at android.os.Bundle.getParcelable(Bundle.java:755)
at android.app.Activity.onCreate(Activity.java:932) //可以看到是在onCreate的時候,進行恢復操作,導致Exception
at android.app.Activity.performCreate(Activity.java:5990)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
at com.duowan.gamecenter.pluginlib.a.abk.callActivityOnCreate(DelegateInstrumentation.java:239)
at com.duowan.gamecenter.pluginlib.environment.abo.callActivityOnCreate(PluginInstrumentation.java:162)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
at android.app.ActivityThread.access$800(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700)
背景:
項目中的Activity是基於FragmentActivity, 當手機/模擬器的內存不足時(日誌:E/History: low memory), 後臺的活動被回收 ,只保留任務棧,再次進入的時候, Activity嘗試恢復 , 出現該崩潰 .
FragmentActivity的onSaveInstanceState源碼:
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
this.markFragmentsCreated();
Parcelable p = this.mFragments.saveAllState();
if (p != null) {
outState.putParcelable("android:support:fragments", p);
}
if (this.mPendingFragmentActivityResults.size() > 0) {
outState.putInt("android:support:next_request_index", this.mNextCandidateRequestIndex);
int[] requestCodes = new int[this.mPendingFragmentActivityResults.size()];
String[] fragmentWhos = new String[this.mPendingFragmentActivityResults.size()];
for(int i = 0; i < this.mPendingFragmentActivityResults.size(); ++i) {
requestCodes[i] = this.mPendingFragmentActivityResults.keyAt(i);
fragmentWhos[i] = (String)this.mPendingFragmentActivityResults.valueAt(i);
}
outState.putIntArray("android:support:request_indicies", requestCodes);
outState.putStringArray("android:support:request_fragment_who", fragmentWhos);
}
}
恢復的時候 , 會在super.onCreate(savedInstanceState);嘗試恢復 , 導致出現本文的錯誤:Class not found when unmarshalling: android.support.v4.app.FragmentManagerState
解決思路就是處理savedInstanceState,不讓它恢復android:support:fragments的內容.
解決方法如下:
在activity的onCreate移除掉Bundle 裏的fragments
@Override
public void onCreate(Bundle savedInstanceState) {
if (savedInstanceState != null) {
savedInstanceState.remove("android:support:fragments");
}
super.onCreate(savedInstanceState);
}