Alarm manager for background services

可紊 提交于 2019-12-23 03:35:28

问题


I have implemented the alarm manager to wake up the background services every 15 mins periodically. It is working fine, but since the inclusion of DOZE mode Android 6.0, the seems like behaving strange and not waking up in every 15 mins. Although, I am using the method alarm.setExactAndAllowWhileIdle(), but still not working in Idle state

here is my method for implementing 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);
}

Any help would be appreciated..thanks


回答1:


Try this:

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);
    }
}

Ive tested scheduling alarms in this way in Doze and it works. They go off every 15 minutes. Check out https://commonsware.com , thats where I found this method of scheduling a repeating alarm.



来源:https://stackoverflow.com/questions/33432661/alarm-manager-for-background-services

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!