getActivity()空ポインタ解決方法

2871 ワード

開発プロジェクトでgetActivity関数が空の場合、apk空ポインタがクラッシュする問題があり、コードロジックに明らかな原因がないことを確認します.
Activity.を見たらJava、FragmentActivity.JAvaのソースコードは原因を見つけることができます.Activityインスタンスがバックグラウンドにある場合、システムはリソースを回収する際にActivityを回収し、onSaveInstanceState関数にfragmentの状態を保存し、再びこのActivityを開くと、onCreateメソッドでbundleのfragmentの状態を取り出す可能性が高いが、fragmentに対応するActivityはとっくに存在しないため、getActivityは空である.
FragmentActivity.java:
 protected void  onCreate(Bundle savedInstanceState) {
       if (savedInstanceState != null) {
                Parcelable p = savedInstanceState.getParcelable(FRAGMENTS_TAG);
mFragments.restoreAllState(p, nc != null ? nc.fragments : null);
                  }
            mFragments.dispatchCreate();
         }

 protected void onSaveInstanceState(Bundle outState) {
               super.onSaveInstanceState(outState);
               Parcelable p = mFragments.saveAllState();
              if (p != null) {
                    outState.putParcelable(FRAGMENTS_TAG, p);
               }
         }

ソースコードからソリューションがわかります:1、onSaveInstanceState関数を上書きし、bundleに保存しません.2、onCreateメソッドを上書きし、FRAGMENTSを削除するTAGパラメータ.(注:ActivityとFragmentActivityのFRAGMENTS_TAGの定義が異なる)
例:
public class TestActivity extends FragmentActivity {         

             @Override
    protected void onCreate(Bundle savedInstanceState) {
          if (savedInstanceState != null) {
                                              savedInstanceState.remove(“android:support:fragments”);   // : Activity android:fragments,  super.onCreate !!!
                      }
          super.onCreate(savedInstanceState);

              }
              // 

  protected void onSaveInstanceState(Bundle outState) {
                     //super.onSaveInstanceState(outState);   // ,  
              }