9

質問タイトルは複雑に聞こえるかもしれませんが、私の状況です。権限設定が変更された後、最近のタスクから再度開くときにonCreate()が呼び出されます

私はアクティビティ内にマップフラグメントを持っています。シンプル。 マップの表示を許可するストレージ権限を有効にしてください。 ホームボタンを押してアプリケーションをバックグラウンドにしてから、ストレージ権限をオフにして最近のタスクからアプリを開くと、アプリがクラッシュします。

問題は、ホストアクティビティのonResume()を呼び出す代わりに、マップアクティビティのonCreate()とマップフラグメントのonCreateView()が呼び出されます。したがって例外を投げている。

権限が変更され、アクティビティが再作成されたときにアプリプロセスが強制終了されたようです。 super.onStartから

09-24 14:42:55.071: E/AndroidRuntime(12918): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
09-24 14:42:55.071: E/AndroidRuntime(12918): Caused by: 
java.lang.NullPointerException: Attempt to write to field 'int android.support.v4.app.Fragment.mNextAnim' on a null object reference 
09-24 14:42:55.071: E/AndroidRuntime(12918): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:718) 
09-24 14:42:55.071: E/AndroidRuntime(12918): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1489) 
09-24 14:42:55.071: E/AndroidRuntime(12918): at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:548) 

()活動

+1

ライフサイクルメソッドは変更されていません。何が起こっているのは、活動がシステムによって破壊されたことです。このため、アクティビティが再作成され、なぜonCreateが呼び出されているのですか。 – eddiecubed

+0

権限が変更されたためにアクティビティが破棄されたとお考えですか? onResume()が正常に呼び出されるため、そのアクティビティのパーミッションが変更された場合は、代わりにonCreate()が呼び出されます。 – WenChao

+1

権限の変更があると、アクティビティは常に破棄されます – greywolf82

答えて

0

から実行可能な解決策は今ちょうど地図の断片を再作成しようとしているから防ぐために、活動の)のonCreate(中getSupportFragmentManager().popBackStackImmediate();を呼び出すことです。

この場合、popBackStack()は非同期であるため動作しません。

0

おそらく少し遅れて、まだ将来的に他の人を助けるかもしれない:)

あなたはsavedInstanceStateonCreate(Bundle savedInstanceState)に渡されるnullであるかどうかを確認する必要があります。それだけで、その後nullだ場合は、そのようFragmentを起動します。

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_layout_file); 

     if (savedInstanceState == null) { 
      // do fragment transactions here 
     } 
    } 
+0

でも、onCreate()が呼び出された後、ondestroy()が呼び出されて、appが閉じられます。 savedInstanceStateは私のアプリが終了するのを防ぎますか? – MiloRambaldi

+0

@MiloRambaldi 'savedInstanceState'には、アプリケーションの最後の状態に関する情報が含まれています(RAMが不足しているためにシステムによって停止された場合、またはこの種の権限の切り替えが行われた場合など)。アプリの殺害を防ぐ手段はありません。 – Sazid

0

私はアプリの許可の動的な変化と同様の問題を抱えていました。私が理解しているものをいくつか発掘した後、あなたにとっても役立つかもしれません。

権限を変更すると、システムによるアプリケーションの終了が引き起こされ、概要画面からアプリケーションを開くと、アプリケーションを再起動します。これは、フラグメントオブジェクトの操作を実行している可能性があり、現在はnullです。

ここで重要な点は、終了前にフラグメント状態がsavedinstanceオブジェクトに保存されていることです。あなたはこのコード行を使用してフラグメントのインスタンスを取得する必要がありますクラッシュ停止するには

- ここ

mapFragment = (MapFragment)getSupportFragmentManager().findFragmentByTag("MAP FRAG"); 

「MAPのFRAGは、」あなたのフラグメントに与える必要がタグです。

あなたが混乱している場合は、共有してください。

関連する問題