当操作系统进入打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。我必须制作一个闹钟应用程序,如果此问题仍然存在,我将无法正确测试行为。
我发现了问题:
首先,打Do睡模式确实不影响 Alarmmanager setExact()函数当我在模拟器中测试我的应用程序时(我使用genymotion)。
然后我决定使用实体电话,即HTC Desire 530,但结果仍然相同。这是我感到沮丧的地方,直到我在HTC官方documentation support page中发现了非常有趣的东西:
手机在以下情况下从打ze模式退出:
您插入电源适配器并为手机充电。
有动作,例如拿起电话时。
闹钟在您设定的时间响起。
我想知道第三个点是否可能是打do模式背后的原因,而不影响Alarmmanager setExact方法。所以我在另一部手机(即OPPO A3)中测试了我的应用。 这是事情按预期运行的地方!
setExact方法当我退出打ze模式时,它没有在打ze模式下运行!
而setExactAndAllowWhileIdle()的运行方式与文档中的描述相同。所以我得出的结论是:-
P.S:
[如果您想知道为什么我这么关心整个事情,那是因为我正在开发一个警报应用程序,并且我正在使用Alarmmanager来执行基于时间的任务。如果该问题持续存在,我将无法正确测试我的应用程序(希望您理解我的意思)。
Android的背景限制和电池优化使简单的事情变得复杂。
UPDATE:-
打ze模式即使在HTC Desire 530中打开了电池优化功能,也对alarmmanager setExact()没有影响。