Android 7.0 (Nougat) 打盹模式停止 Web 服务

Posted

技术标签:

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

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

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

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

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

【问题讨论】:

【参考方案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,如果设备进入打盹模式,唤醒锁将不起作用,对吧? 我认为唤醒锁不会让设备进入睡眠状态

以上是关于Android 7.0 (Nougat) 打盹模式停止 Web 服务的主要内容,如果未能解决你的问题,请参考以下文章

仅从 Android 7.0 (Nougat) 开始支持默认接口方法

API 级别 24 中的前台服务 - Android 7.0 Nougat

android 7.0 (nougat)的编译优化-ninja

Android 7.0 Nougat(牛轧糖)---对开发者来说

具透丨Android 7.0 Nougat 正式版来了,这是最全面的上手指南

Android Studios:Android 设备管理器在文件资源管理器中未显示 Nougat 7.0 的文件