web-dev-qa-db-fra.com

Android Définir plusieurs alarmes

J'essaie d'implémenter une application Android qui doit sonner l'alarme plusieurs fois dans le temps.

J'ai déjà effectué une recherche, mais le plus proche que j'ai trouvé était un nombre défini d'alarmes et je suppose que l'exemple n'a pas fonctionné.

Ce que je veux savoir s’il existe une approche permettant de définir de manière dynamique plusieurs alarmes, comme un tableau d’alarmes, puis de les déclencher dans leurs horodatages spécifiques.

36
Sammy

Si vous souhaitez définir plusieurs alarmes (répétitives ou uniques), il vous suffit de créer leur PendingIntent avec différents requestCode. Si requestCode est identique, alors la nouvelle alarme remplacera l'ancienne.

Voici le code pour créer plusieurs alarmes simples et les conserver dans ArrayList. Je garde PendingIntent dans le tableau parce que c'est ce dont vous avez besoin pour annuler votre alarme.

// context variable contains your `Context`
AlarmManager mgrAlarm = (AlarmManager) context.getSystemService(ALARM_SERVICE);
ArrayList<PendingIntent> intentArray = new ArrayList<PendingIntent>();

for(i = 0; i < 10; ++i)
{
   Intent intent = new Intent(context, OnAlarmReceiver.class);
   // Loop counter `i` is used as a `requestCode`
   PendingIntent pendingIntent = PendingIntent.getBroadcast(context, i, intent, 0);
   // Single alarms in 1, 2, ..., 10 minutes (in `i` minutes)
   mgrAlarm.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, 
                SystemClock.elapsedRealtime() + 60000 * i, 
                pendingIntent); 

   intentArray.add(pendingIntent);
}

Voir aussi cette question: Comment définir plusieurs alarmes à la fois dans Android? .

87

Vous pouvez définir la répétition de l'alarme:

dans ce cas:

public void AddAlarm(int requestCode,MutableDateTime dueDate,int repeat) {
        Intent intent = new Intent(context, AlarmReceiver.class);
        intent.putExtra(Constants.RECORD_ID, requestCode);
        intent.putExtra("REPEAT", repeat);
        PendingIntent operation = PendingIntent.getBroadcast(context, requestCode, intent,  PendingIntent.FLAG_ONE_SHOT );
        MutableDateTime due = dueDate.toMutableDateTime();
        switch(repeat){
        case NO_REPEAT:
            due.addMinutes(0);
            break;
        case DAILY:

            due.addDays(1); 
            break;
        case WEEKLY:
            due.addWeeks(1);
            break;
        case MONTHLY:
            due.addMonths(1);
            break;
        case MONTHLY_2:
            due.addWeeks(5);            
            break;
        case YEARLY:
            due.addYears(1);
            break;
        }
        due.add(-(dueDate.getMillis()));
        due.setSecondOfMinute(0);
        dueDate.setSecondOfMinute(0);
        alarm.cancel(operation);
        alarm.set(AlarmManager.RTC_WAKEUP, dueDate.getMillis(), operation);
        alarm.setRepeating(AlarmManager.RTC_WAKEUP, dueDate.getMillis(), due.getMillis(), operation);
}
5
iamkristher

Pour configurer de manière dynamique plusieurs alarmes, l’approche que j’ai utilisée est la création d’une seule alarme. Ensuite, dans ma classe de paramètres d’alarme, un entier statique (à utiliser comme code requête) est initialisé. Il est incrémenté chaque fois de mon activité principale chaque fois que je clique sur le bouton "Ajouter une alarme" dans mon activité principale . E.g.

MainActivity.Java

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}

public void addAlarmClick(View v) {
    AlarmActivity.broadcastCode++;
    startActivity(new Intent(this, AlarmActivity.class));
}
}

AlarmActivity.Java

public class AlarmActivity extends AppCompatActivity {`

public static int broadcastCode=0;
/*some code here*/
Intent myIntent = new Intent(AlarmActivity.this, AlarmReceiver.class);
pendingIntent = PendingIntent.getBroadcast(AlarmActivity.this,
                            broadcastCode, myIntent, 0);

J'espère que cela aidera.

0
Junaid