【问题标题】:Android does not execute everything on nightAndroid 不会在晚上执行所有操作
【发布时间】:2014-07-11 08:43:20
【问题描述】:

我编写了一个创建服务的程序。

该服务每 5 分钟连接到一个网站,收集一行数据并将其输出到文件中。

我的问题是它没有每 5 分钟收集一次数据。数据在大约 50-70 分钟内收集一次。为什么? android中有什么东西会阻止后台服务在夜间正常运行吗?对我来说也很奇怪的是,50-70 分钟的休息时间只发生在我不使用手机的时候。

它收集数据的次数:

1:40
1:45
1:50
1:55
2:00
2:05
2:10
2:15
2:20
2:25
2:30 I was awake until this.
3:20
4:15
5:00
6:05
6:55
7:55
8:45
10:20
10:50 Woke up at here.
10:55

【问题讨论】:

  • 答案为您提供了技术原因,但请记住,某些设备具有节电模式。如果启用此功能,那么即使您实施了这些更改,您的服务也可能无法连接。设计您的应用程序,使其能够处理数据中的间隙并请求丢失的块。

标签: android save android-service


【解决方案1】:

您的结果并不令人惊讶。 Android 旨在根据资源的整体水平以及其他因素刷出(并重新进入)进程。

修改您的服务以成为foreground service肯定会改善您的结果:

Notification notification = new Notification(R.drawable.icon, getText(R.string.ticker_text),
        System.currentTimeMillis());
Intent notificationIntent = new Intent(this, ExampleActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
notification.setLatestEventInfo(this, getText(R.string.notification_title),
        getText(R.string.notification_message), pendingIntent);
startForeground(ONGOING_NOTIFICATION_ID, notification);

前台服务基本上是 Android 保证不易被刷出的服务, 这就是你想要的。


但即使是前台服务也会在设备进入睡眠状态时停止其处理。而且,如果您觉得您的轮询逻辑足够重要,可以防止设备进入休眠状态,您还应该acquire a wakelock

注意:长时间运行的唤醒锁对电池使用有巨大的影响。小心处理!


最后,请考虑为您的任务使用alarm警报通常被认为是更好的选择 长时间运行的轮询任务。


【讨论】:

    【解决方案2】:

    根据您用于安排更新的方法,操作系统might 会进行更新以减少电池消耗和整体负担。 Delayed 如果设备进入深度睡眠,任务可能会被推迟(发生在晚上,主要是因为设备在很长一段时间内处于非活动状态)。

    【讨论】:

      【解决方案3】:

      这样做是为了防止您的电池快速耗尽。如果你真的想每 5 分钟唤醒一次你的设备,你可以查看the answer to this post and use the AlarmManager

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-28
        • 1970-01-01
        • 1970-01-01
        • 2012-12-26
        • 2017-03-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多