报警管理器为后台服务

时间:2015-10-30 09:29:44

标签: android android-service alarmmanager android-alarms android-6.0-marshmallow

我已经实施了警报管理器,每15分钟定时唤醒后台服务。它工作正常,但自从包含DOZE模式Android 6.0以来,似乎表现得很奇怪而且每隔15分钟就没有醒来。虽然,我使用的方法是alarm.setExactAndAllowWhileIdle(),但仍然无法在空闲状态下工作

这是我实现Alarm Manager的方法

 private void serviceRunningBackground()
{
    final Intent restartIntent = new Intent(this, service.class);
    restartIntent.putExtra("ALARM_RESTART_SERVICE_DIED", true);
    alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
   Handler restartServiceHandler;
    restartServiceHandler = new Handler() {
         @Override
         public void handleMessage(Message msg) {
             pintent = PendingIntent.getService(getApplicationContext(), 0, restartIntent, 0);
             if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1) {
                 Log.d(TAG, " Marshmellow "+ TIMER_START_TIME);
                 alarmMgr.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, 900000, pintent);                  
             } else {
                 alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 900000, pintent);
             }
             sendEmptyMessageDelayed(0, TIMER_START_TIME);
         }
     };
    restartServiceHandler.sendEmptyMessageDelayed(0, 0);
}

任何帮助都会受到赞赏。谢谢

1 个答案:

答案 0 :(得分:2)

试试这个:

public class PollReceiver extends WakefulBroadcastReceiver{
    static final String PERIOD = "period";
    @Override
    public void onReceive(Context context, Intent intent){
         startWakefulService(context,new Intent(context,MyService.class));
         long period = intent.getLongExtra(PERIOD,-1);
         if(period>0){
         scheduleExactAlarm(context,(AlarmManager)context.getSystemService(Context.ALARM_SERVICE),period)
         }
    }


    static void scheduleExactAlarm(Context context,AlarmManager alarms, long period){
    Intent i = new Intent(context,PollReceiver.class);
    PendingIntent pi = PendingIntent.getBroadcast(context,0,i,0);
    if(Build.VERSION.SDK_INT>Build.VERSION_CODES.LOLLIPOP_MR1){
        alarms.setExactAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP,
        SystemClock.elapsedRealtime() + period,pi);
    }
}

我已经在Doze中以这种方式测试了调度警报并且它可以工作。他们每15分钟一班。查看https://commonsware.com,我找到了这种安排重复警报的方法。