setExactAndAllowWhileIdle不一致

时间:2018-12-27 16:08:58

标签: android alarmmanager

我有一个可以提醒用户卫星通行证的应用程序。我已经注意到,卫星通知无法在Android 8(特别是8.1.0)上正常工作。

要唤醒我的应用并显示通知,我正在使用AlarmManager。

                PendingIntent pendingIntent = PendingIntent.getService(myActivity, requestCode++, intent, 0 );

                int delay = 70; // Seconds
                Calendar cal = Calendar.getInstance();

                // Print out the milliseconds before and after 
                // adding the delay just to make sure it is correct.
                Log.i( "NotificationMgr", String.format( "%d", cal.getTimeInMillis() ) );
                cal.add( Calendar.SECOND, delay ); // For testing
                Log.i( "NotificationMgr", String.format( "%d", cal.getTimeInMillis() ) );

                // Register the pending intent with the AlarmManager
                AlarmManager alarmMgr = (AlarmManager) getSystemService( Activity.ALARM_SERVICE );

                if ( android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M )
                {
                    alarmMgr.setExactAndAllowWhileIdle( AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), pendingIntent );
                }

在测试中,如果我将延迟设置为60秒以上,则不会触发警报,但是不会触发警报。 60秒以内的任何时间都可以。这段代码可以在我拥有的Android 6设备上正常运行。

有人知道为什么这在Android 8上不起作用吗?

[稍后]

好的,在Logcat中浏览,当警报触发时,我会看到以下消息:

2018-12-28 13:31:36.301 772-2222 /? W / ActivityManager:不允许后台启动:服务意图{flg = 0x4 cmp = com.simulationcurriculum.skysafari6plus / com.simulationcurriculum.skysafari.AlarmHandler(具有其他功能)}到com.simulationcurriculum.skysafari6plus / com.simulationcurriculum.skysafari。 pid = -1 uid = 10150 pkg = com.simulationcurriculum.skysafari6plus

任何想法意味着什么?

[甚至以后...]

搜索该警告消息后,我发现了一个发现他需要使用getForegroundService()而不是getService()的人。我现在为Oreo及以上版本执行此操作。这似乎对我有用,但是我需要做进一步的测试。

说实话,我不清楚两个电话的区别。这种变化的后果是什么?如果有人启发我,我将不胜感激。

[更多信息]

大多数情况下,使用getForgroundService可以使用,但是当设备处于打ze模式时则不能使用。我已经看到了一些有关使用JobScheduler的参考资料,但是在这篇文章中,他暗示了在Doze模式下仍然无法使用的事实:

Service not starting on Oreo in app widget using PendingIntent

为什么Google很难做到这一点?

0 个答案:

没有答案