这是我的Activity
代码,
Long time = new GregorianCalendar().getTimeInMillis()+20000;//Setting alarm after 20 sec Intent intentAlarm = new Intent("alarm"); intentAlarm.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intentAlarm.putExtra("req_code",10); PendingIntent pendingIntent = PendingIntent.getBroadcast(context,10, intentAlarm, PendingIntent.FLAG_UPDATE_CURRENT); AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); alarmManager.set(AlarmManager.RTC_WAKEUP, time, pendingIntent);
这些是我在我的应用中拥有的所有权限,
这是我的BroadcastReceiver
代码,
@Override public void onReceive(Context context, Intent intent) { SharedPreferences sharedPreferences = context.getSharedPreferences( "mydata", Context.MODE_PRIVATE); SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putBoolean("elligible",true); editor.apply(); }
我BroadcastReceiver
在清单上注册了我的,
上面的代码BroadcastReceiver
在后台成功执行了on MarshMallow设备,但是在MarshMallow设备上,BroadcastReceiver
没有执行.有谁知道这里会发生什么?谢谢.
您可以尝试一些事项,当一起使用时,应该能够切断所有空闲/待机/打盹模式(无论操作系统版本如何).
1. 使用WakefulBroadcastReceiver
而不是普通的BroadcastReceiver
.确保包含WAKE_LOCK
正确使用它的权限.
2.使用该setExactAndAllowWhileIdle()
方法(在API 23及更高版本上)Intent
为接收者安排:
if(Build.VERSION.SDK_INT < 23){ if(Build.VERSION.SDK_INT >= 19){ setExact(...); } else{ set(...); } } else{ setExactAndAllowWhileIdle(...); }
参考文献:
1. 后台服务的报警管理器.
2. 后台工作,闹钟和Android应用程序的流程图.
原因可能是Android 6.0 Marshmallow中引入的Doze模式.使用setAlarmclock()而不是set()
.它专为闹钟而设计,可能能够通过打瞌睡.您可以使用一些adb命令手动将手机置于打盹或应用待机模式:
https://developer.android.com/preview/features/power-mgmt.html
如果那不能唤醒你的应用程序,那就是确保方法setExactAndAllowWhileIdle()用于将手机从打瞌睡中唤醒,无论如何.最糟糕的情况是,您可以使用此方法唤醒应用程序并使用唤醒来安排下一个警报.
参考: 如何在Doze模式下安装Android 6.0时使Alarm Manager工作?