1

我已經實施了報警管理器來定期喚醒後臺服務,每15分鐘一次。它運行良好,但自從包含DOZE模式Android 6.0後,似乎表現得很奇怪,並且每15分鐘就不醒來。雖然,我現在用的方法alarm.setExactAndAllowWhileIdle(),但仍然無法在空閒狀態後臺服務報警管理器

在這裏工作是我實現報警管理方法

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

任何幫助將是appreciated..thanks

+0

您正在測試現在的哪個版本? –

+0

Nexus 5上的Android 6.0預覽, – user3290805

+1

使用'System.currentTimeMillis()+ 900000',它會在15分鐘後觸發警報。您需要在'service.java'的初始方法內再次編寫這樣的代碼,以便在接下來的15分鐘內設置警報。 –

回答

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

伊夫這樣打盹測試調度報警和它的作品。他們每15分鐘就會關閉一次。檢查出https://commonsware.com,那是我發現這種安排重複警報的方法。

+0

的註釋部分是否適用於Android 5.0和6.0 ? –