Android: Cara menggunakan AlarmManager

89

Saya perlu memicu blok kode setelah 20 menit sejak AlarmManagerditetapkan.

Dapatkah seseorang menunjukkan kepada saya kode contoh tentang cara menggunakan AlarmManagerdi ِ Android?

Saya telah bermain-main dengan beberapa kode selama beberapa hari dan itu tidak akan berhasil.

Tom
sumber

Jawaban:

109

"Beberapa kode contoh" tidak semudah itu AlarmManager.

Berikut ini cuplikan yang menunjukkan penyiapan 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);

Dalam contoh ini, saya menggunakan setRepeating(). Jika Anda menginginkan alarm sekali pakai, Anda cukup menggunakan set(). Pastikan untuk memberikan waktu untuk alarm mulai dalam basis waktu yang sama seperti yang Anda gunakan di parameter awal untuk set(). Dalam contoh saya di atas, saya menggunakan AlarmManager.ELAPSED_REALTIME_WAKEUP, jadi basis waktu saya adalah SystemClock.elapsedRealtime().

Berikut adalah contoh proyek yang lebih besar yang menunjukkan teknik ini.

CommonsWare
sumber
2
Halo lagi. Terima kasih balasannya. Jika saya membeli buku Anda, apakah buku itu menjelaskan cara menerapkan pengelola alarm secara lengkap?
Tom
7
Buku Advanced Android (Versi 0.9) memiliki ~ 9 halaman yang mencakup AlarmManager, WakeLocks, dan contoh lainnya. Itu mungkin akan berkembang sedikit di Versi 1.0 saat saya melakukan perbaikan yang saya sebutkan dalam jawaban saya di atas. Dan jika Anda memiliki pertanyaan tentang buku atau kode sampelnya, kunjungi groups.google.com/group/cw-android dan saya akan dengan senang hati menjawabnya.
CommonsWare
17
Setiap pengembang android harus berlangganan buku Mark :) Setidaknya sekali
Bostone
1
@ MarioGalván: Anda perlu menyetelnya saat aplikasi Anda dijalankan untuk pertama kali dan saat reboot.
CommonsWare
Saya pikir Anda harus menggunakan AlarmManager.RTC_WAKEUP jika Anda ingin mengaktifkannya segera dan kemudian setiap PERIODE. Dalam kode Anda, itu akan diaktifkan setelah SystemClock.elapsedRealtime () dan kemudian setiap PERIOD.
Damon Yuan
66

Ada beberapa contoh bagus dalam kode contoh android

. \ android-sdk \ samples \ android-10 \ ApiDemos \ src \ com \ example \ android \ apis \ app

Yang harus diperiksa adalah:

  • AlarmController.java
  • OneShotAlarm.java

Pertama, Anda memerlukan penerima, sesuatu yang dapat mendengarkan alarm Anda saat dipicu. Tambahkan berikut ini ke file AndroidManifest.xml Anda

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

Kemudian, buat kelas berikut

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

Kemudian, untuk memicu alarm, gunakan yang berikut (misalnya dalam aktivitas utama Anda):

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

.


Atau, lebih baik lagi, buat kelas yang menangani semuanya dan gunakan seperti ini

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

dengan cara ini, Anda memiliki semuanya di satu tempat (jangan lupa untuk mengedit 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();
     }
}
Default
sumber
2
Hai yang disana! Saya menguji kode ini dan bekerja dengan baik (+1). tetapi saya mencoba ini untuk beberapa alarm (seperti satu untuk 10 detik, dan satu lagi untuk 15, dan hanya satu detik yang diaktifkan. Apakah saya melakukan sesuatu yang salah, atau apakah itu raja masalah? EDIT: Oke, saya menemukan masalahnya di sini : stackoverflow.com/questions/2844274/…
Nuno Gonçalves
FWIW, saya akan menggunakan metode statis daripada konstruktor untuk ini.
Edward Falk
9

Yang perlu Anda lakukan adalah membuat maksud yang perlu Anda jadwalkan terlebih dahulu. Kemudian dapatkan pendingIntent dari maksud tersebut. Anda dapat menjadwalkan aktivitas, layanan, dan siaran. Untuk menjadwalkan aktivitas, mis. Aktivitas Saya:

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

Berikan pendingIntent ini ke 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);

Sekarang MyActivity akan diluncurkan setelah 5 detik peluncuran aplikasi, tidak peduli Anda menghentikan aplikasi atau perangkat Anda dalam keadaan tidur (karena opsi RTC_WAKEUP). Anda dapat membaca kode contoh lengkap Penjadwalan aktivitas, layanan, dan siaran #Android

SohailAziz
sumber
+1 jawaban bagus, persis seperti yang saya butuhkan, contoh 'set' yang berfungsi.
A. Alqadomi
4

Saya ingin berkomentar tetapi <50 perwakilan, jadi begini. Pengingat ramah bahwa jika Anda menjalankan pada 5.1 atau lebih tinggi dan Anda menggunakan interval kurang dari satu menit, ini terjadi:

Suspiciously short interval 5000 millis; expanding to 60 seconds

Lihat disini .

kurt
sumber
3

Beberapa kode contoh saat Anda ingin memanggil layanan dari 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);

Anda tidak perlu meminta izin pengguna.

Usaha Iklan Digital
sumber
Singkatan yang sangat umum.
Phantômaxx
0

AlarmManager digunakan untuk memicu beberapa kode pada waktu tertentu.

Untuk memulai Manajer Alarm, Anda harus terlebih dahulu mendapatkan instans dari Sistem. Kemudian teruskan PendingIntent yang akan dieksekusi di waktu mendatang yang Anda tentukan

AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

Intent alarmIntent = new Intent(context, MyAlarmReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, alarmIntent, 0);
int interval = 8000; //repeat interval
manager.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), interval, pendingIntent);

Anda harus berhati-hati saat menggunakan Pengelola Alarm. Biasanya, pengelola alarm tidak dapat mengulang sebelum satu menit. Juga dalam mode daya rendah, durasinya dapat meningkat hingga 15 menit.

Faxriddin Abdullayev
sumber