2016-09-05 3 views
1

Я хочу позвонить BroadcastReceiver через определенный промежуток времени. BroadcastReceiver звонит, но он не звонит ровно через 10 секунд, иногда он вызывает 20 секунд, иногда более 20 секунд. Я хочу назвать BroadcastReceiver ровно через 10 секундAlarmManager, не вызывающий BroadcastReceiver через определенный промежуток времени

Это код MainActivity

Intent myIntent = new Intent(MainActivity.this, SampleReceiver.class); 
PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, myIntent,0); 
AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE); 
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, wakeupTime,1000 * 10, pendingIntent); 

Это код BroadcastReceiver

public class SampleReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     Log.e("Brodcast","receiver"); 
    } 
} 

Это мой файл журнала

09-05 14:48:21.444 18222-18222/com.loconav.partners.tracker E/Brodcast: receiver 
09-05 14:49:21.509 18222-18222/com.loconav.partners.tracker E/Brodcast: receiver 
09-05 14:50:31.578 18222-18222/com.loconav.partners.tracker E/Brodcast: receiver 
09-05 14:51:21.618 18222-18222/com.loconav.partners.tracker E/Brodcast: receiver 
+0

http://stackoverflow.com/questions/39036001/android-how-to-run-background-service-periodically/39036118#39036118 это поможет –

+0

я хочу повторить после определенных секунд. Это вызов, но не через определенный интервал времени –

+0

@SumitMarwha Это потому, что повторяющиеся сигналы тревоги неточны на уровне API 19+. См. Мой ответ ниже. – earthw0rmjim

ответ

0

Сначала используйте тип ELAPSED_REALTIME_WAKEUP, потому что вам не нужен огонь будильник в определенное время суток. Когда вы используете время rtc, он может быть обновлен системой - когда он синхронизируется с сервером времени, и ваш сигнал тревоги никогда не будет срабатывать вообще.

Во-вторых, не используйте BroadcastReceivers, определенные как подклассы Activity - они должны быть настроены в AndroidManifest.xml, потому что если ваша деятельность будет уничтожена, вы никогда не получите свое намерение.

+0

Я не получаю вашу вторую точку –

+0

Ну, если вам нужно что-то делать каждые 10 секунд, пока активность запущена - используйте TimerTask или Thread или что-то еще. BroadcastReceiver должен быть объявлен в манифесте и использоваться без запуска экземпляра Activity. –

2

С documentation из AlarmManager:

Примечание: Начиная с API 19 (KITKAT) доставка сигнала тревоги неточна: ОС сместится сигналы для того, чтобы свести к минимуму пробуждений и использование батареи. Там - это новые API для поддержки приложений, которым необходима строгая доставка гарантии; см. setWindow(int, long, long, PendingIntent) и setExact(int, long, PendingIntent). Приложения, чья targetSdkVersion ранее, чем API 19, по-прежнему будут видеть предыдущее поведение , в котором все аварийные сигналы доставляются именно тогда, когда запрашивается .

Точное повторение в настоящий момент невозможно с помощью одного набора сигналов тревоги на уровне API 19+.

Если вы хотите, чтобы ваш повторяющийся сигнал тревоги срабатывал точно, когда вы этого хотите, тогда вы должны использовать setExact() (или setExactAndAllowWhileIdle() в соответствии с вашими потребностями) и перенести его каждый раз, когда он срабатывает.

0

Я думаю, что вам нужно предоставить уникальный код запроса, чтобы получить широковещательный метод.

Intent myIntent = new Intent(MainActivity.this, SampleReceiver.class); 
       PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this, uniqueRequestCode, myIntent,0); 
       AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE); 
       alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, wakeupTime,1000 * 10, pendingIntent); 

uniqueRequestCode может быть System.currentTimeInMilliSecond

0

Я не знаю, что там в wakeupTime. код работает для меня, как

alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(),1000*10,pendingIntent);