【问题标题】:Why is doze mode not affecting the AlarmManager setExact() function?为什么打盹模式不影响 AlarmManager setExact() 函数?
【发布时间】:2020-02-02 05:25:54
【问题描述】:

当操作系统进入打盹模式时,我正在尝试测试我的 Android 应用的行为。我正在使用运行 Android API 25 的 gennymotion 模拟器。应用程序使用类型为 RTC_WAKEUP 的方法 setExact 通过 AlarmManager 启动 IntentService。我将警报设置为在 1 分钟后触发(仅用于测试目的)。

这是意图服务代码(MyService.java):-

public class MyService extends IntentService {

public static final String TAG = "noor";

@Override
public void onHandleIntent(Intent intent) {
    for (int i = 1; i <= 10; i++) {
        Log.d(TAG, "i: " + i);

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

}

这是警报管理器代码:-

AlarmManager alarm = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(this, MyService.class);
        PendingIntent pendingIntent = PendingIntent.getService(this, 101, intent, 0);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            alarm.setExact(AlarmManager.RTC_WAKEUP,System.currentTimeMillis() + (60 * 1000),pendingIntent);
        }

}

只是为了确保我成功通过运行以下建议的 dumpsys 命令将模拟器置于 IDLE 状态:-

adb shell dumpsys deviceidle enable
adb shell dumpsys battery unplug
adb shell dumpsys deviceidle force-idle

我什至用

仔细检查过
adb shell dumpsys deviceidle get deep

现在问题来了:-

即使设备处于空闲状态,我仍然能够看到警报正在启动的 IntentService(MyService)。这些是 logcat 结果:-

    2019-10-04 01:42:20.842 1818-1922/com.example.android.sunshineweatherapp D/noor: i: 1
2019-10-04 01:42:21.843 1818-1922/com.example.android.sunshineweatherapp D/noor: i: 2
2019-10-04 01:42:22.845 1818-1922/com.example.android.sunshineweatherapp D/noor: i: 3
2019-10-04 01:42:23.856 1818-1922/com.example.android.sunshineweatherapp D/noor: i: 4
2019-10-04 01:42:24.857 1818-1922/com.example.android.sunshineweatherapp D/noor: i: 5
2019-10-04 01:42:25.859 1818-1922/com.example.android.sunshineweatherapp D/noor: i: 6
2019-10-04 01:42:26.860 1818-1922/com.example.android.sunshineweatherapp D/noor: i: 7
2019-10-04 01:42:27.861 1818-1922/com.example.android.sunshineweatherapp D/noor: i: 8
2019-10-04 01:42:28.862 1818-1922/com.example.android.sunshineweatherapp D/noor: i: 9
2019-10-04 01:42:29.863 1818-1922/com.example.android.sunshineweatherapp D/noor: i: 10

根据文档,这不应该是预期的行为:-

标准 AlarmManager 警报(包括 setExact() 和 setWindow()) 推迟到下一个维护时段。

所以我也期待相反的情况(因为如果设备处于打盹模式,则不应触发 setExact())。 我什至在真实设备(运行 Android Marshmallow)上对此进行了测试,得到了相同的结果。

这是一个错误吗?还是我错过了什么?

以下问题可能重复,但未按要求给出答案:- Android M (preview) Doze mode and AlarmManager

PS:-

这是我第三次在这个平台上发布这个问题,因为我没有得到任何答案。我在整个互联网(reddit、androidcentral、quora、coderanch)上都找不到任何帮助
我必须制作一个闹钟应用程序,如果此问题仍然存在,我将无法正确测试行为。

【问题讨论】:

  • 你有没有试过在真机上测试这个案例?
  • @BenShmuel 是的,我在运行 android 6 的 HTC Desire 上对其进行了测试,但得到了相同的结果......令人惊奇的是,作业调度程序没有在打盹模式下运行(如预期的那样),但警报管理器 setexact () 做到了!

标签: java android alarmmanager emulation android-doze


【解决方案1】:

我发现了问题:

首先,当我在模拟器中测试我的应用程序时(我使用的是 genymotion),打盹模式不影响alarmmanager setExact() 函数

然后我决定使用实体手机,即 HTC Desire 530,但结果还是一样。这就是我感到沮丧的地方,直到我在 HTC 官方documentation support page 中发现了一些非常有趣的东西:

手机在以下情况下退出打盹模式:

您插入电源适配器并为手机充电。

有动作,例如当你拿起电话时。

闹钟在您设定的时间响起。

我想知道第三点是否可能是打盹模式不影响警报管理器 setExact 方法的原因。所以我在另一部手机(即 OPPO A3s)上测试了我的应用程序。 这是按预期运行的地方!

setExact 方法没有在打盹模式下运行,而当我退出打盹模式时它确实运行了! 而 setExactAndAllowWhileIdle() 的运行方式与文档中所写的一样。

所以我得出的结论是:-

  • HTC 可能已经修改了打盹模式行为? (由于android正式 限制警报管理器 setExact 在打盹模式下执行,而 HTC 没有)。这种(可能是幼稚的)假设背后的原因是我在一些安卓手机中看到了一些不标准的行为,比如即使设备关闭,警报也会响起!
  • 最后但同样重要的是,永远不要相信你的模拟器:p

附注:

如果您想知道为什么我对这整件事如此关注,那是因为我正在开发一个警报应用程序,并且我正在使用警报管理器来执行基于时间的任务。如果这个问题持续存在,我将无法正确测试我的应用程序(希望你明白我的意思)。

Android 的后台限制和电池优化让简单的事情变得复杂。

更新:-

即使我在 HTC Desire 530 中打开电池优化,打盹模式对警报管理器 setExact() 也没有影响。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-21
    • 1970-01-01
    • 1970-01-01
    • 2017-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多