【问题标题】:Android 7.0 (Nougat) Doze Mode Stops Web ServiceAndroid 7.0 (Nougat) 打盹模式停止 Web 服务
【发布时间】:2017-02-08 02:12:53
【问题描述】:

我有一个带有 WiFi 锁的 Android 前台服务,它充当另一个本地设备的 Web 服务。在打瞌睡模式之前,获取 WiFi 锁并根据需要提供服务非常有效。

即使我的应用关闭了电池优化,当屏幕关闭几分钟后,手机仍然会关闭应用。

我如何正确提醒 Android 客户明确请求的服务正在前台执行,并且他们不希望他们的手机此时进入睡眠状态?

编辑:这个问题在 Android 8.0 (Oreo) 中仍然存在

【问题讨论】:

    标签: android android-wifi android-doze


    【解决方案1】:

    你可以这样做:就像你调用你的服务一样,你可以添加一个代码来保持屏幕唤醒。这将避免手机自动锁定。以下是文档中的示例代码 sn-p。

        public class MainActivity extends Activity {
          @Override
          protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            //keep screen awake
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
          }
    

    这种方法的优势在于,与唤醒锁不同,它不需要特殊权限,并且平台可以正确管理用户在应用程序之间的移动,而您的应用程序无需担心释放未使用的资源。 此外,您可以按照此 SO answer 中所述的有效方式使用警报管理器:

    【讨论】:

    • 感谢您的回答。保持屏幕打开可能会起作用。但是,它会消耗更多的电池,并且当用户简单地关闭屏幕时,工作就结束了。我不应该因为服务器正在运行而教育他们让屏幕亮着。
    【解决方案2】:

    尝试使用前台服务-https://developer.android.com/guide/components/services.html#Foreground

    前台服务是用户主动了解的服务 并且不是系统在内存不足时杀死的候选者。一种 前台服务必须为状态栏提供通知, 位于 Ongoing 标题下。这意味着 除非服务停止,否则通知不能被解除 或从前台删除。

    您也可以尝试 FULL_WAKE_LOCK 或 SCREEN_DIM_WAKE_LOCK 看看它是否会阻止您的设备进入打盹模式。请参阅 -https://developer.android.com/reference/android/os/PowerManager.html#FULL_WAKE_LOCK

    【讨论】:

    • 感谢您的回答,但正如问题的前五个字所述,我正在使用前台服务。
    • @rupesh,如果设备进入打盹模式,唤醒锁将不起作用,对吧?
    • 我认为唤醒锁不会让设备进入睡眠状态
    猜你喜欢
    • 2017-05-03
    • 1970-01-01
    • 1970-01-01
    • 2017-12-18
    • 1970-01-01
    • 2016-01-06
    • 1970-01-01
    • 2016-06-27
    • 1970-01-01
    相关资源
    最近更新 更多