3

我正在使用報警管理器在特定時間觸發廣播。但經過多次測試後,我發現有時廣播收到很晚。有時5秒,10秒,15秒甚至更多。特別是當設備被鎖定時。我做過各種實驗。我最不成問題的代碼就在這裏。從等待中的意圖接收廣播的Android問題

即使使用喚醒鎖後,我不知道我缺乏什麼。

燒成意圖

Intent intent = new Intent(this.getApplicationContext(), BroadCastReceiver.class); 
//..... some extras 
PendingIntent pi = PendingIntent.getBroadcast(getApplicationContext(), code, intent, 0); 
manager.setRepeating(AlarmManager.RTC_WAKEUP, time, 1000 * 120 , pi); 

接收廣播

public void onReceive(Context context, Intent intent) 
{ 
     WakeLocker.acquire(context); 
     ....... 
     Intent alarm = new Intent(context, xyz.class); 
     alarm.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     context.startActivity(alarm); 
} 

和釋放激活鎖定在破壞()的xyz活性。

定製WakeLocker類 公共抽象類WakeLocker {

private static PowerManager.WakeLock wakeLock; 

public static void acquire(Context ctx) { 
    if (wakeLock != null) wakeLock.release(); 

    PowerManager pm = (PowerManager) ctx.getSystemService(Context.POWER_SERVICE); 
    wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | 
      PowerManager.ACQUIRE_CAUSES_WAKEUP | 
      PowerManager.ON_AFTER_RELEASE, "haris"); 
    wakeLock.acquire(); 
} 

public static void release() { 
    if (wakeLock != null) wakeLock.release(); wakeLock = null; 
} 

}

+0

您使用的是Android棒棒糖嗎?看看這個:http://developer.android.com/intl/es/training/scheduling/alarms.html – logoff 2015-11-12 20:02:32

回答

1

official documentation據:

AlarmManager。 setRepeating(...)
截至API 19,所有重複報警 都是不精確的。如果您的應用程序需要準確的交貨時間,那麼它必須使用一次性精確警報,每次重新安排上述 。 targetSdkVersion早於API 012的舊應用程序將繼續具有其所有警報,包括重複 警報,並將其視爲確切。

這意味着您必須在收到它時再次設置您的PendingIntent。
事情是這樣的:

public class MyBroadcastReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(final Context context, Intent intent) { 
    switch (intent.getAction()) { 
     case AlarmHelper.ACTION_MY_ALARM: 
      doWhatYouNeed(); 
      long nextTime = getNextAlarmTime(); 
      AlarmHelper.resetAlarm(nextTime); 
      break; 
     ... 
     } 
    } 
} 

取得下一個報警時間,你可以使用System.currentTimeMillis的()+間隔或將其傳遞給意圖演員,第二種方法更準確。 而且,我敢肯定,您不需要BroadcastReceiver中的WakeLock。

public class AlarmHelper { 
    public static void resetAlarm(long time) { 
     Intent intent = createIntent(); 
     PendingIntent pendingIntent = createPendingIntent(intent); 
     setAlarmManager(time, pendingIntent); 
    } 

    public static void setAlarmManager(long time, PendingIntent pendingIntent) { 
     AlarmManager alarmManager = (AlarmManager) MyApp.getAppContext().getSystemService(Context.ALARM_SERVICE); 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
      alarmManager.setExact(AlarmManager.RTC_WAKEUP, time, pendingIntent); 
     } else { 
      alarmManager.set(AlarmManager.RTC_WAKEUP, time, pendingIntent); 
     } 
    } 
}