- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试测试 Android 应用程序在操作系统进入打瞌睡模式时的行为。我正在使用运行 Android API 25 的 gennymotion 模拟器。应用程序使用 RTC_WAKEUP 类型的 setExact 方法通过 AlarmManager 启动 IntentService。我将警报设置为 1 分钟后触发(仅用于测试目的)。
这是 Intent 服务代码(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
根据文档,这不应该是预期的行为:-
Standard AlarmManager alarms (including setExact() and setWindow()) are deferred to the next maintenance window.
所以我也期待相反的情况(因为如果设备处于打瞌睡模式,则不应触发 setExact() )。 我什至在真实设备(运行 Android Marshmallow)上对此进行了测试,并得到了相同的结果。
这是一个错误吗?或者我错过了什么?
以下问题可能重复,但答案未按预期给出:- Android M (preview) Doze mode and AlarmManager
附注:-
这是我第三次在这个平台上发布这个问题,因为我没有得到任何答案。我在整个互联网(reddit、androidcentral、quora、coderanch)中找不到任何帮助。
我必须制作一个闹钟应用程序,如果这个问题仍然存在,我将无法正确测试行为。
最佳答案
我发现了问题:
首先,当我在模拟器中测试我的应用程序时,打瞌睡模式不会影响alarmmanager setExact()函数(在我的例子中我使用了genymotion)。
然后我决定使用实体手机,即 HTC Desire 530,但结果仍然相同。这就是我感到沮丧的地方,直到我在HTC官方documentation support page中发现了一些非常有趣的东西。那是:
The phone exits from Doze mode when:
You plug in the power adapter and charge the phone.
There's movement, such as when you pick up the phone.
An alarm clock goes off at your set time.
我想知道第三点是否可能是打瞌睡模式不影响alarmmanager setExact方法的原因。所以我在另一部手机(即 OPPO A3s)上测试了我的应用程序。 事情按预期运行!
setExact 方法没有在打瞌睡模式下运行,但当我退出打瞌睡模式时它确实运行了!而 setExactAndAllowWhileIdle() 的运行就像文档中所写的那样。
所以我得出的结论是:-
附注:
如果您想知道为什么我如此关心这整件事,那是因为我正在开发一个闹钟应用程序,并且我正在使用闹钟管理器来执行基于时间的任务。如果这个问题持续存在,我将无法正确测试我的应用程序(希望您明白我的意思)。
Android 的后台限制和电池优化让简单的事情变得复杂。
更新:-
即使我在 HTC Desire 530 中打开电池优化,打瞌睡模式对 Alarmmanager setExact() 也没有影响。
关于java - 为什么打瞌睡模式不影响 AlarmManager setExact() 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58226813/
我想在每次触发 AlarmManager 时额外更改 Intent。这可能吗,我如何在 AlarmManager 触发后立即调用它? 代码: public void startCollector(){
public class AlarmManagerClass extends BroadcastReceiver { public static boolean haveInternet
我正在寻找执行简单任务的最有效方法。作为一名新的 android 开发人员,我不太确定这些策略中的哪一个在内存效率方面最适合我的应用程序。我想其中一些方法可能会导致我不知道的线程问题。 所有三个解决方
我的应用程序有一个实时模块,它应该每 60 秒 ping 服务器一次。否则,连接将断开,设备将需要重新连接。 第一次尝试是使用 Thread.Sleep 使 ping 线程以所需的频率运行。第二次尝试
我有一组在重启后需要保留的警报。我试过在启动接收器上使用,但它们不会重新启动。我不确定我是否了解启动接收器以及如何重新启动所有警报。我已经有一个接收器来接收我的通知,但不知道我是否可以使用同一个接收器
我有一个要在其中创建警报的 Android 应用程序。这是一个正常的闹钟,应该在指定的时间叫醒你。与任何警报一样,您还可以通过在创建警报时选择声音文件来指定它将使用哪种警报声音。 闹钟效果很好,它在正
我的任务是定期读取后端的手机传感器(例如 WiFi、加速度计)。 我目前的解决方案是使用 AlarmManager。 具体来说,我们有: 在“主”程序(一个 Activity )中,我们使用 Pend
public void SetAlarm(Context context, int sec) { AlarmManager am=(AlarmManager)context.getSyst
我已经通过警报管理器制作了简单的警报,问题是当插入很多秒时,它无法及时工作,这是我在这里声明的 这是代码 mo = ((Integer.parseInt(mons.getText().toStrin
我在应用程序中设置了一个闹钟,每 X 分钟触发一次通知。第一次有效,但随后就不重复了。 我正在开发的 API 是 API 18 (Android 4.3)。 MainActivity.class pu
我很难专心于对 AlarmManager 进行编程。 下面的代码几乎只是将当前日期分配给文本字段并获取一些 XML 并使用 setListAdapter 显示它。我希望这段代码在启动时运行,然后每 3
我对如何停止 AlarmManager 有疑问。我想在“x”小时开始并在“y”小时停止,由用户设置。我知道“.cancel”功能的存在,但不知道如何设置“y”小时内的停止时间。 创建时 final E
我的应用程序有一个 AlarmManager 设置为每 60 秒触发一次。它会触发一个 fragment ,该 fragment 检查当前时间并查找应用程序日历中当时是否有任何事件发生。它运行得很好,
我正在尝试安排使用 AlarmManager 调用的方法,但它似乎不起作用。我看过其他例子,但他们的例子不适合我。所以我认为这是我的代码中的一些内容。这是 AlarmManager 代码: Alarm
我将 AlarmManager 设置如下: Intent startIntent = new Intent(context, MyService.class); PendingIntent pend
我正在尝试使用警报管理器发出警报。应用程序运行时没有任何错误消息,但没有任何反应。 我尝试了来自developer.android.com的解决方案和来自stackoverflow的建议。我也尝试复制
public class background_alarm extends BroadcastReceiver { @Override public void onReceive(Context co
我编写了一个每天凌晨 5:22 运行的闹钟代码。该代码在第一个时间间隔内运行良好,但在第二个时间间隔内会在 24 小时之前触发。 我在 MainActivity 的 onCreate() 方法中添加了
我在这些类(class)中有两个类(class),A,B。他们两个我都有一个像下一个这样的警报管理器; class A{ PendingIntent sender; AlarmManager am
我在 9:00 和 21:00 有两个 AlarmManager,但只运行第二个闹钟。 ////////9:00am///////// Intent aviso = new Inten
我是一名优秀的程序员,十分优秀!