2016-09-15 47 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); 
    } 
}