Frage

Ich brauche einen Code-Block nach 20 Minuten zum Auslösen von den AlarmManager eingestellt wird.

Kann jemand mir zeigen Beispielcode, wie einen AlarmManager in Android verwenden?

Ich habe mit einigem Code für ein paar Tage herumgespielt und es wird einfach nicht funktionieren.

War es hilfreich?

Lösung

„Einige Codebeispiel“ ist nicht so einfach, wenn es um AlarmManager kommt.

Hier ist ein Ausschnitt der Einrichtung von AlarmManager zeigt:

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 diesem Beispiel habe ich setRepeating() verwende. Wenn Sie einen One-Shot-Alarm ausgelöst werden sollen, würden Sie nur set() verwenden. Achten Sie darauf, die Zeit geben für den Alarm in der gleichen Zeitbasis zu starten, wie Sie in dem ursprünglichen Parameter verwenden, um set(). In meinem Beispiel oben, ich bin mit AlarmManager.ELAPSED_REALTIME_WAKEUP, so meine Zeitbasis ist SystemClock.elapsedRealtime().

Hier ist ein größeres Beispielprojekt diese Technik zeigt.

Andere Tipps

Es gibt einige gute Beispiele in der Android-Beispielcode

  

. \ Android-sdk \ samples \ android-10 \ ApiDemos \ src \ com \ Beispiel \ android \ api \ app

Die, die heraus zu überprüfen sind:

  • AlarmController.java
  • OneShotAlarm.java

Als erstes benötigen Sie einen Empfänger, etwas, das zu Ihrem Alarm hören kann, wenn er ausgelöst wird. Fügen Sie den folgenden zu AndroidManifest.xml Datei

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

Dann erstellen die folgende Klasse

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

Dann einen Alarm auszulösen, verwenden Sie die folgende (zum Beispiel in Ihrer Haupttätigkeit):

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);

.


Oder, noch besser, eine Klasse machen, die alles und es verwendet, wie diese Griffe

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

auf diese Weise, Sie haben sie alle an einem Ort (nicht vergessen die AndroidManifest.xml zu bearbeiten)

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();
     }
}

Was Sie tun müssen, ist zunächst die Absicht erstellen Sie planen müssen. Dann erhalten die PendingIntent dieser Absicht. Sie können Aktivitäten, Dienstleistungen und Übertragungen planen. Um eine Aktivität beispiel MyActivity planen:

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

Geben Sie diesen PendingIntent auf 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);

Jetzt wird MyActivity sein und nach 5 Sekunden der Anwendung zu starten, egal Sie beenden Ihre Anwendung oder ein Gerät im Ruhezustand ging (aufgrund RTC_WAKEUP Option). Sie können vollständige Beispielcode Scheduling-Aktivitäten, Dienstleistungen und Übertragungen lesen #Android

wollte ich kommentieren, aber <50 rep, geht so hier. Freundliche Erinnerung, dass, wenn Sie auf 5.1 laufen oder höher und ein Intervall von weniger als eine Minute verwenden, dies geschieht:

Suspiciously short interval 5000 millis; expanding to 60 seconds

Siehe hier .

Einige Beispielcode, wenn Sie einen Dienst aus der Alarmmanager nennen wollen:

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);

Sie müssen nicht userpermissions fragen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top