我有一个可以提醒用户卫星通行证的应用程序。我已经注意到,卫星通知无法在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很难做到这一点?