如何防止在屏幕锁定上调用onStop()

时间:2016-03-22 07:15:01

标签: android android-service activity-lifecycle android-broadcastreceiver

我的应用具有某些功能,我在onStop()方法中调用,即当我在应用之间切换时。

它有一个videoview所以我只想在切换应用时将其切换为音频。

我已在onStop()方法中实现了此功能,但当屏幕被锁定时,它会调用onStop(),我的应用会启动后台音频播放。

我想在屏幕锁定时保留活动,而不是切换到后台音频播放。

我尝试使用broadcast receiver捕获屏幕锁定事件,但它在调用onStop()后捕获事件。

在屏幕被锁定时,我需要帮助阻止调用onStop() ,或者在调用onStop()方法之前以任何方式检测屏幕锁定事件。

2 个答案:

答案 0 :(得分:2)

首先,当屏幕锁定时,您无法阻止调用onStop。当Activity从可见状态变为不可见状态时,它将始终被调用。

是的,您可以检测锁定屏幕:

KeyguardManager myKM = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);
  if( myKM.inKeyguardRestrictedInputMode()) {
      //it is locked
  } else {
    //it is not locked
  }

如果在设置中将screenlock设置为none,则无效;>安全 - >屏幕锁。

编辑1: 如果您想使用PowerManager

PowerManager pm = (PowerManager) this.getSystemService(Context.POWER_SERVICE);
if (pm.isInteractive()) {
   // the device is in an interactive state.
}

编辑2:

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

boolean screenOn;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) {
    screenOn = pm.isInteractive();
} else {
    screenOn = pm.isScreenOn();
}

if (!screenOn) {
    // screen is Off.
}

答案 1 :(得分:2)

您可以检查onStop屏幕是否关闭。如果它打开,只需切换到音频,否则什么也不做(但不要忘记调用onStop的超级)。

@Override
public void onStop() {
    PowerManager pm = (PowerManager) this.getSystemService(Context.POWER_SERVICE);
    if (pm.isScreenOn()) {
       // switch to audio
    }
    super.onStop();
}