2016-09-15 3 views
1

Я хочу изменить Intent с каждым огнем AlarmManager. Возможно ли это, как я могу позвонить AlarmManager, как только он выстрелил?Как вызвать метод AlarmManager после срабатывания AlarmManager?

Код:

public void startCollector(){ 
    final int LOOP_REQUEST_CODE = 4; 
    Intent i = new Intent(getApplicationContext(), DataCollector.class); 
    PendingIntent sender = PendingIntent.getBroadcast(getApplicationContext(),LOOP_REQUEST_CODE,i,PendingIntent.FLAG_NO_CREATE); 
    long firstTime = SystemClock.elapsedRealtime(); 
    firstTime += 3*1000; 
    AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE); 
    //TO CHANGE INTENT EXTRAS DO NOT REMOVE. 
    if(sender != null){ 
     am.cancel(sender); 
    } 
    if(getLocation() != null) { 
     i.putExtra("JLocation", getLocation()); 
    } 
    i.putExtra("JLocation",getLocation()); 
    sender = PendingIntent.getBroadcast(getApplicationContext(),LOOP_REQUEST_CODE,i,PendingIntent.FLAG_CANCEL_CURRENT); 
    am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstTime, 100000, sender); 
} 

ответ

1

Я предлагаю вам использовать точную сигнализацию вместо того, чтобы использовать setRepeating() и перенести его каждый раз, когда он стреляет.

(setRepeating() является неточным и не работает с дремлют в любом случае)

Например:

Intent intent = new Intent(this, AlarmReceiver.class); 
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0); 

AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE); 

// if you would like to fire the next alarm very precisely 
// put this value in the Intent and use it in your receiver 
// to calculate the next time for the alarm 
long fireAt = SystemClock.elapsedRealtime() + 5000; 

if(Build.VERSION.SDK_INT >= 23) { 
    am.setExactAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP, 
       fireAt, pendingIntent); 
} else if(Build.VERSION.SDK_INT >= 19) { 
    am.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, fireAt, pendingIntent); 
} else { 
    am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, fireAt, pendingIntent); 
} 

И в ресивере:

@Override 
public void onReceive(Context context, Intent intent) { 

    // change the Intent as you wish 
    intent.putExtra("anExtra", "aValue"); 
    // or create a new one 
    //Intent newIntent = new Intent(context, this.getClass()); 

    PendingIntent pendingIntent = PendingIntent 
     .getBroadcast(context, 0, intent, 0); 

    AlarmManager am = (AlarmManager) context.getSystemService(ALARM_SERVICE); 

    long fireAt = SystemClock.elapsedRealtime() + 5000; 

    if(Build.VERSION.SDK_INT >= 23) { 
     am.setExactAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP, 
       fireAt, pendingIntent); 
    } else if(Build.VERSION.SDK_INT >= 19) { 
     am.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, fireAt, pendingIntent); 
    } else { 
     am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, fireAt, pendingIntent); 
    } 
} 
Смежные вопросы