2016-07-08 5 views
2

次の構造を持つアプリケーションをビルドしています。バックグラウンドから死んだアプリを再開すると、奇妙な動作をしています

MainActivity -> Fragment1 
      -> Fragment2 -> Fragment3 

ここで、Fragment1はFrameLayoutのMainActivityでホストされています。ユーザーがFragment1で任意のオプションをクリックすると、ViewPagerでFragment3をホストするFragment2に切り替わります。

問題は、ユーザーがアプリを終了せずにアンドロイドホームに移動し、アプリがAndroidによって強制終了され、最近のアプリリストからアプリを再開しようとすると、Fragment3は空白の画面を表示しています。

は、ここで私は断片取引のため

public void requestChangeFragment(Fragment newFragment,String tag,Fragment oldFragment, int anim_in, int anim_out){ 
     if(isStopped()){ 
      return; 
     } 
     mFragmentManager = getSupportFragmentManager(); 
     android.support.v4.app.FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction(); 
     fragmentTransaction.setCustomAnimations(anim_in,anim_out,anim_in,anim_out); 
     fragmentTransaction.add(R.id.main_frame_layout, newFragment, tag); 
     Log.i("FragMngr","Animations set in "+anim_in+" out "+anim_out); 
     fragmentTransaction.addToBackStack(tag); 
     int count = mFragmentManager.getBackStackEntryCount(); 
     String log=""; 
     fragmentTransaction.commit(); 
     for(int i=0;i<count;i++){ 
      android.support.v4.app.FragmentManager.BackStackEntry backStackEntry = mFragmentManager.getBackStackEntryAt(i); 
      log += "count "+i+" name "+backStackEntry.getName()+"\n"; 
     } 
     Log.d("FragMngr","BackStack trace after adding is\n "+log); 
     if(oldFragment!=null) { 
      if(oldFragment.isResumed()) { 
       oldFragment.onPause(); 
      } 
     } 
     topFragment = newFragment; 
    } 

requestChangeFragment()を使用しています方法はMainActivityで実装interfaceの助けを借りて、断片を実行から呼ばれています。

+0

コードを追加できますか? onResumeメソッドやonPauseメソッドのように – user6547359

+0

ログ以外のメソッドには基本的に何もありません。私がこれらの断片でCrashlyticsを使用しようとしているときでもクラッシュしています。 (Crashlyticsは初期化されていません)、Crashlyticsを初期化しようとしている場合、そのコンテキストを表示することはできません。 –

+0

おそらくライフサイクルを本当にうまく管理しているとは限りません。あなたがそれを読むためにwnatすれば良いチュートリアルです。https://www.raywenderlich.com/117838/introduction-to-android-fragments-tutorial – user6547359

答えて

0

いくつかの調査をした後、アプリケーションが使用されていないときにアンドロイドガベージコレクタがアプリを殺すたびに、フラグメントの現在の状態を保存する保存されたインスタンスであることがわかりました。だから、私は死んだアプリを再開しようとすると、それはアプリケーションを一時停止する前に選択されたフラグメントを移動します。しかし、フラグメントにはMainクラスから受け取ったデータがありません。

解決方法:MainActivityの保存済みインスタンスをonCreateメソッドで消去します。または、保存したインスタンス状態に値を格納している場合は、保存したインスタンス状態に関連する操作を実行して値をクリアしてからsuper.onCreate(savedInstanceState)

関連する問題