Domanda

Ho bisogno di innescare un blocco di codice dopo 20 minuti dal AlarmManager fase di impostazione.

Qualcuno mi può mostrare il codice di esempio su come utilizzare un AlarmManager in Android?

Ho giocato in giro con un po 'di codice per un paio di giorni e semplicemente non funzionerà.

È stato utile?

Soluzione

"Alcuni codice di esempio" non è così facile quando si tratta di AlarmManager.

Ecco un frammento che mostra la configurazione del AlarmManager:

AlarmManager mgr=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent i=new Intent(context, OnAlarmReceiver.class);
PendingIntent pi=PendingIntent.getBroadcast(context, 0, i, 0);

mgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), PERIOD, pi);

In questo esempio, sto usando setRepeating(). Se si desidera un allarme di one-shot, si sarebbe solo usare set(). Essere sicuri di dare il tempo per la sveglia per iniziare nella stessa base dei tempi, come si usa nel parametro iniziale per set(). Nel mio esempio di cui sopra, io sto usando AlarmManager.ELAPSED_REALTIME_WAKEUP, quindi la mia base dei tempi è SystemClock.elapsedRealtime().

Qui è un progetto di campione più ampio che mostra questa tecnica.

Altri suggerimenti

Ci sono alcuni buoni esempi nel codice di esempio Android

  

. \ Android-sdk \ samples \ android-10 \ ApiDemos \ src \ com \ esempio \ API \ Android \ app

Quelli da verificare sono:

  • AlarmController.java
  • OneShotAlarm.java

In primo luogo, è necessario un ricevitore, qualcosa che può ascoltare il vostro allarme quando viene attivato. Aggiungere il seguente al file AndroidManifest.xml

<receiver android:name=".MyAlarmReceiver" />

Quindi, creare la seguente classe

public class MyAlarmReceiver extends BroadcastReceiver { 
     @Override
     public void onReceive(Context context, Intent intent) {
         Toast.makeText(context, "Alarm went off", Toast.LENGTH_SHORT).show();
     }
}

Quindi, per attivare un allarme, utilizzare il seguente (per esempio nella vostra attività principale):

AlarmManager alarmMgr = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(this, MyAlarmReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
Calendar time = Calendar.getInstance();
time.setTimeInMillis(System.currentTimeMillis());
time.add(Calendar.SECOND, 30);
alarmMgr.set(AlarmManager.RTC_WAKEUP, time.getTimeInMillis(), pendingIntent);

.


O, meglio ancora, fare una classe che gestisce il tutto e usarlo come questo

Bundle bundle = new Bundle();
// add extras here..
MyAlarm alarm = new MyAlarm(this, bundle, 30);

in questo modo, si ha tutto in un unico luogo (non dimenticare di modificare il AndroidManifest.xml)

public class MyAlarm extends BroadcastReceiver {
    private final String REMINDER_BUNDLE = "MyReminderBundle"; 

    // this constructor is called by the alarm manager.
    public MyAlarm(){ }

    // you can use this constructor to create the alarm. 
    //  Just pass in the main activity as the context, 
    //  any extras you'd like to get later when triggered 
    //  and the timeout
     public MyAlarm(Context context, Bundle extras, int timeoutInSeconds){
         AlarmManager alarmMgr = 
             (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
         Intent intent = new Intent(context, MyAlarm.class);
         intent.putExtra(REMINDER_BUNDLE, extras);
         PendingIntent pendingIntent =
             PendingIntent.getBroadcast(context, 0, intent, 
             PendingIntent.FLAG_UPDATE_CURRENT);
         Calendar time = Calendar.getInstance();
         time.setTimeInMillis(System.currentTimeMillis());
         time.add(Calendar.SECOND, timeoutInSeconds);
         alarmMgr.set(AlarmManager.RTC_WAKEUP, time.getTimeInMillis(),
                      pendingIntent);
     }

      @Override
     public void onReceive(Context context, Intent intent) {
         // here you can get the extras you passed in when creating the alarm
         //intent.getBundleExtra(REMINDER_BUNDLE));

         Toast.makeText(context, "Alarm went off", Toast.LENGTH_SHORT).show();
     }
}

Quello che dovete fare è creare prima l'intento è necessario pianificare. Poi ottenere il pendingIntent di tale intenzione. È possibile pianificare attività, servizi e trasmissioni. Per pianificare un'attività per esempio MyActivity:

  Intent i = new Intent(getApplicationContext(), MyActivity.class);
  PendingIntent pi = PendingIntent.getActivity(getApplicationContext(),3333,i,
  PendingIntent.FLAG_CANCEL_CURRENT);

Dare questo pendingIntent a AlarmManager:

  //getting current time and add 5 seconds in it
  Calendar cal = Calendar.getInstance();
  cal.add(Calendar.SECOND, 5);
  //registering our pending intent with alarmmanager
  AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
  am.set(AlarmManager.RTC_WAKEUP,cal.getTimeInMillis(), pi);

Ora MyActivity sarà lanciato dopo 5 secondi del lancio dell'applicazione, non importa si ferma l'applicazione o il dispositivo è andato in stato di sospensione (a causa di RTC_WAKEUP opzione). Si può leggere completo esempio di codice Pianificazione attività, servizi e trasmissioni #android

ho voluto commentare, ma <50 rep, quindi ecco qui. Amichevole promemoria che se si sta eseguendo su 5.1 o superiore e si utilizza un intervallo di meno di un minuto, questo accade:

Suspiciously short interval 5000 millis; expanding to 60 seconds

qui .

Un codice d'esempio quando si desidera chiamare un servizio dal AlarmManager:

PendingIntent pi;
AlarmManager mgr;
mgr = (AlarmManager)ctx.getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent(DataCollectionActivity.this, HUJIDataCollectionService.class);    
pi = PendingIntent.getService(DataCollectionActivity.this, 0, i, 0);
mgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() , 1000, pi);

Non dovete chiedere userpermissions.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top