web-dev-qa-db-ja.com

super.onBackPressed()のonSaveInstanceStateの後にこのアクションを実行することはできません

ユーザーが押し戻してアプリケーションを終了すると、インタースティシャル広告が表示されます。

_mInterstitialAd.setAdListener(new AdListener() {
   @Override
   public void onAdClosed() {
        onBackPressed(); //line 98
   }
});

requestNewInterstitial();

private void requestNewInterstitial() {
   AdRequest adRequest = new AdRequest.Builder().build();
   mInterstitialAd.loadAd(adRequest);
}

@Override
public void onBackPressed() {
   if (mInterstitialAd.isLoaded()) {
      mInterstitialAd.show();
   } else {
      super.onBackPressed(); //line 410
   }
}
_

これは、ユーザーから受け取ったクラッシュレポートです。

_Java.lang.RuntimeException: Unable to pause activity {com.myapp/com.google.Android.gms.ads.AdActivity}: Java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at Android.app.ActivityThread.performPauseActivity(ActivityThread.Java:3088)
at Android.app.ActivityThread.performPauseActivity(ActivityThread.Java:3043)
at Android.app.ActivityThread.handlePauseActivity(ActivityThread.Java:3021)
at Android.app.ActivityThread.access$1000(ActivityThread.Java:138)
at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1253)
at Android.os.Handler.dispatchMessage(Handler.Java:102)
at Android.os.Looper.loop(Looper.Java:149)
at Android.app.ActivityThread.main(ActivityThread.Java:5045)
at Java.lang.reflect.Method.invokeNative(Native Method)
at Java.lang.reflect.Method.invoke(Method.Java:515)
at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:794)
at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:610)
at dalvik.system.NativeStart.main(Native Method)
Caused by: Java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at Android.app.FragmentManagerImpl.checkStateLoss(FragmentManager.Java:1323)
at Android.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.Java:493)
at Android.app.Activity.onBackPressed(Activity.Java:2215)
at com.myapp.MainActivity.onBackPressed(MainActivity.Java:410)
at com.myapp.MainActivity$1.onAdClosed(MainActivity.Java:98)
at com.google.Android.gms.ads.internal.client.zzc.onAdClosed(Unknown Source)
at com.google.Android.gms.ads.internal.client.zzm$zza.onTransact(Unknown Source)
at Android.os.Binder.transact(Binder.Java:361)
at com.google.Android.gms.ads.internal.client.l.a(SourceFile:109)
at com.google.Android.gms.ads.internal.a.n(SourceFile:645)
at com.google.Android.gms.ads.internal.b.t(SourceFile:351)
at com.google.Android.gms.ads.internal.t.t(SourceFile:141)
at com.google.Android.gms.ads.internal.overlay.ab.n(SourceFile:672)
at com.google.Android.gms.ads.internal.overlay.ab.i(SourceFile:408)
at com.google.Android.gms.ads.internal.overlay.a.d.onTransact(SourceFile:86)
at Android.os.Binder.transact(Binder.Java:361)
at com.google.Android.gms.internal.zzdj$zza$zza.onPause(Unknown Source)
at com.google.Android.gms.ads.AdActivity.onPause(Unknown Source)
at Android.app.Activity.performPause(Activity.Java:5335)
at Android.app.Instrumentation.callActivityOnPause(Instrumentation.Java:1233)
at Android.app.ActivityThread.performPauseActivity(ActivityThread.Java:3074)
_

ユーザーが広告を閉じるとトリガーされることは理解していますが、なぜsuper.onBackPressed()で停止するのですか?

17
erdomester

アクティビティが一時停止しているときは、onBackPressed()を呼び出すことはできません。ただし、バックプレスでの動作は、アクティビティを終了することです。 finish()の代わりにonBackPressed()を呼び出すだけです。

onBackPressed()のオーバーライドで、アクティビティが終了することを確認する必要があります。他の理由で戻ることができます。

14

エラーの原因がFragmentManagerImpl.popBackStackImmediateであることを示すスタックトレースを確認できます。

これはonActivityResultとまったく同じで、インタースティシャル広告を表示するとアクティビティが一時停止し、onAdClosed()の場合、アプリはまだ再開されていないようです。

これを解決するには、onAdClosed()にフラグを設定し、フラグがオンの場合はonBackPressed()onResume()を呼び出します。

4
Derek Fung