android studio oncreate メソッド - OnPauseとOnStop()は、アクティビティの開始直後に呼び出されます。



3 Answers

android:configChanges="keyboardHidden|orientation|screenSize"あなたのManifest Activityに追加します。 これはあなたの問題を解決するかもしれません。

android studio oncreate onresume

私は起動時に画面をオンにする必要があるアクティビティを持っています。 だからonCreateでは、私は持っている:

this.getWindow().setFlags(
            WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
                    | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                    | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON,
            WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
                    | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                    | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);

これをブロードキャスター受信機のwakelockの助けを借りて使用すると、私はブロードキャスト受信機から起動されるたびに自分の活動を表示させることができます。

しかし、問題は非常に奇妙であり、アクティビティライフサイクルはこのように呼び出され、アクティビティの開始直後にonPause()およびonResume

  1. onCreate
  2. onStart
  3. onResume
  4. onPause
  5. onStop
  6. onStart
  7. onResume

だから、問題は開始時に2回呼び出すことをやめ、また停止してもonStop()でいくつかのロジックを実装したいのですが、このような動作のアプリケーションでは正しく動作しません。

編集

私は問題がフラグFLAG_SHOW_WHEN_LOCKEDに起因するだけであることを発見しました。 デバイスがロックされているとき アクティビティの開始前にデバイスがロックされている場合にのみ発生します。

PS私は、放送受信機でアラームマネージャーを使用しているし、放送受信機からの活動を開始します。




あなたはonStop()でいくつかのロジックを実装したいと言っていますが、このような動作アプリでは正しく動作しません。 あなたは正確にあなたがonStop()の中に何を持っているのか私たちに示さなかったのですが、あなたのロジックがおそらくアクティビティを再開したと思います。その場合、onStopでロジックを実装することができます:

@Override
protected void onStop(){
    super.onStop();

         //implement your code only if !STATE_OFF - to prevent infinite loop onResume <-> onStop  while screen is off                      
        DisplayManager dm = (DisplayManager) this.getSystemService(Context.DISPLAY_SERVICE);
        for (Display display : dm.getDisplays()){
               if(display.getState() != Display.STATE_OFF){

                 //implement your code only if device is not in "locked"  state     
                KeyguardManager myKM = (KeyguardManager) this.getSystemService(Context.KEYGUARD_SERVICE);
                if( !myKM.inKeyguardRestrictedInputMode())      
                    //If needed you can call finish() (call onDestroy()) and your logic will restart your activity only once.             
                    finish();                  
                    // implement your logic here (your logic probably restarts the activity)
                }
            }
        }
    }
  1. あなたがonStop()を避け、onWindowFocusChangedをboolで使うのに役立つ他の解決策hasFocus

      /**
      * Called when the current {@link Window} of the activity gains or loses
      * focus.  This is the best indicator of whether this activity is visible
      * to the user.
      */
        @Override
           public void onWindowFocusChanged(boolean hasFocus){
             super.onWindowFocusChanged(hasFocus);
             if( ! hasFocus  ){
             }
             else{
             }
           }
    



これを試して。 私はこれを使用して、それは正常に動作します

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);

        _wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP,
            POWER_SERVICE);
    _wakeLock.acquire();



Related