スクリーンをOnにした時のイベントを取得した時
private BroadcastReceiver screenStatusReceiver = new BroadcastReceiver() {//スクリーンのON/OFFイベントを検出する @Override public void onReceive(Context context, Intent intent) { // Receive screen off if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { // OFF LoginTimeSave(); } if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { // ON fragmentだとIllegalStateExceptionでる LoginReqired(); } } };
でやるのだが、この時fragmentを生成しようとすると
java.lang.RuntimeException: Error receiving broadcast Intent { act=android.intent.action.SCREEN_ON flg=0x50000010 } in com.medicalmonitor.MainActivity$20@451d81d0
と
Caused by: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
が出て強制終了してしまう。
onSaveInstanceState()はonPause()/onStop()の直後に発生するから、onPause()からonResume()の間に操作しなければ解決する。
結果的にcommitAllowingStateLossを使うことで解決できた。
でもこれActivityが再構築された時とかにおかしくなるからあんまり使わないほうがいいらしい。まぁとりあえずこれで様子見。
Fragment prev = getSupportFragmentManager().findFragmentByTag("DigLogin"); if (prev == null) {//これがないと何個もダイアログ作られる //Dialog_LoginReqired newFragment = Dialog_LoginReqired.newInstance(null); //newFragment.show(getSupportFragmentManager(), "DigLogin");//DigDrugはTAG findFragmentByTagでみつけれる Dialog_LoginReqired dialog = new Dialog_LoginReqired(); //dialog.show(getSupportFragmentManager(), null); FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.add(dialog, "DigLogin"); ft.commitAllowingStateLoss(); }