【问题标题】:How to prevent call to onStop() on screen lock如何防止在屏幕锁定时调用 onStop()
【发布时间】:2016-03-22 07:15:00
【问题描述】:

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

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

我已经在 onStop() 方法中实现了这个,但是当屏幕被锁定时,它会调用 onStop() 并且我的应用程序开始后台音频播放。

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

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

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

【问题讨论】:

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


    【解决方案1】:

    首先,您不能阻止在屏幕锁定时拨打onStop。当Activity 从可见状态变为不可见状态时,它总是会被调用。

    是的,您可以检测到锁屏:

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

    如果在设置 -> 安全 -> 屏幕锁定中将屏幕锁定设置为无,这将不起作用。

    编辑 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.
    }
    

    【讨论】:

    • 我应该在 onStop() 还是广播接收器中使用它?
    • onStop中使用这个会更好。
    • 下面@nvi9 的解决方案有效,即使屏幕锁定设置为无。
    • @ShivamArora,查看编辑后的答案。这没有被弃用。
    • isInteractive() 方法需要 api 级别 20。但我的应用程序需要最低 api 级别 16。所以它不能完美运行。不过,我赞成您的回答,因为它很有用。谢谢。
    【解决方案2】:

    您可以在onStop 中查看屏幕是否关闭。如果开启,则直接切换到音频,否则什么都不做(但不要忘记调用 onStop 的 super)。

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

    【讨论】:

    • 谢谢您的回答。它有效,但 isScreenOn() 方法已被弃用。有没有新的方法或替代品?
    • 是的,我知道它已被弃用,但如果您查看源代码(例如grepcode.com/file/repository.grepcode.com/java/ext/…),您可以看到它从新的 isInteractive() 方法返回值,其中 isScreenOn( ) 已弃用。所以最简单的调用 isScreenOn() 的方法,它适用于所有 api 级别(可能是 5 及以上)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多