待机模式暂停前台服务。

3
我正在编写一个数据记录器应用程序,每5分钟需要进行一次HTTP请求。用户已经知道电池的耗电量,这对我来说没问题。我正在使用前台服务,并且有一个处理程序线程,每5分钟会发布可运行任务。当手机进入DOZE MODE时,似乎线程会被挂起,没有可运行的任务会执行。这是正常的行为还是我漏掉了什么? 如果您能提供任何帮助,将不胜感激。
启动线程的服务代码:
private void startTheForegroundService() {   
      NotificationCompat.Builder builder = new NotificationCompat.Builder(MainService.this);
      builder.setPriority(Notification.PRIORITY_HIGH);
      startForeground(1000, builder.build());

      httpThread = new HttpThread("Ping Thread", Thread.NORM_PRIORITY);
      httpThread.start();
      httpThread.loop();
}

多线程代码:

public class HttpThread extends HandlerThread {
   public Handler mHandler;

   public HttpThread(String name, int priority) {
      super(name, priority);
   }

   public synchronized void waitUntilReady() {
      mHandler = new Handler(getLooper(), new Handler.Callback() {
         @Override
         public boolean handleMessage(Message msg) {
            return false;
         }
      });
   }

   public void loop() {
      waitUntilReady();
      mHandler.post(new Runnable(){
      @Override
      public void run() {
         //code for the http request.
       }
     });
   }
}
1个回答

1

这是正常的行为吗?

是的,对于 Android 6.0 中的 Doze 模式而言是正常的,当应用程序静止了一小时左右时触发。M 开发者预览版扩展了 Doze 模式,使其在设备移动时也部分触发,但我认为您的情况仍将继续工作。

用户知道电池电量下降的情况

用户可以将您添加到电池优化白名单中(设置 > 应用 > (齿轮图标) > 电池优化)。


我已经将该应用程序加入白名单了。但是当设备进入Doze模式时,您的音乐流媒体应用程序(前台服务)是否仍在获取数据?我的处理程序根本没有触发。 - georgeok
@GiorgosOikonomou:“我已经将应用程序加入白名单了”-- 嗯...“您的音乐流媒体应用程序(前台服务)在设备处于DOZE模式时是否继续获取数据?”-- 在Android 6.0上,我没有在未连接充电器的情况下运行流媒体音乐应用程序一个多小时。也许Android以不同的方式处理具有音频焦点的应用程序。“我的处理程序根本没有触发”-- 您确定服务没有停止吗?您还可以考虑使用ScheduledExecutorService而不是基于Handler的方法,并查看是否有更好的运气。 - CommonsWare
一旦从多任务标签中清除应用程序(多任务 - -> 关闭应用程序),ScheduledExecutorService作业将停止工作。 - Shivam Gaur
@ShivamGaur:是的。ScheduledExecutorServiceHandler和任何其他进程内定时解决方案只有在进程运行时才能工作。 - CommonsWare
@Nick:Doze模式与任何应用被“杀死”无关。 - CommonsWare
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接