为什么打do模式不影响AlarmManager setExact()函数?

问题描述 投票:0回答:1

当操作系统进入打OS模式时,我正在尝试测试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())推迟到下一个维护窗口。

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

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

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

P.S:-

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

java android alarmmanager emulation android-doze
1个回答
1
投票

我发现了问题:

首先,打Do睡模式确实不影响 Alarmmanager setExact()函数当我在模拟器中测试我的应用程序时(我使用genymotion)。

然后我决定使用实体电话,即HTC Desire 530,但结果仍然相同。这是我感到沮丧的地方,直到我在HTC官方documentation support page中发现了非常有趣的东西:

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

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

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

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

我想知道第三个点是否可能是打do模式背后的原因,而不影响Alarmmanager setExact方法。所以我在另一部手机(即OPPO A3)中测试了我的应用。 这是事情按预期运行的地方!

setExact方法当我退出打ze模式时,它没有在打ze模式下运行!

而setExactAndAllowWhileIdle()的运行方式与文档中的描述相同。

所以我得出的结论是:-

  • HTC可能已修改了ze睡模式的行为? (自android正式发布以来在HTC时以alarm睡模式限制执行警报管理器的设置不)。这个(也许是幼稚的)假设背后的原因是,我在某些android手机中看到了一些非标准行为,例如,即使设备电源关闭,警报也会响起!
  • 也是最后但并非最不重要的一点,请不要相信您的模拟器:p
  • P.S:

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

Android的背景限制和电池优化使简单的事情变得复杂。

UPDATE:-

打ze模式即使在HTC Desire 530中打开了电池优化功能,也对alarmmanager setExact()没有影响。

© www.soinside.com 2019 - 2024. All rights reserved.