Android: วิธีใช้ AlarmManager


90

ฉันต้องการทริกเกอร์บล็อกของโค้ดหลังจาก 20 นาทีจากAlarmManagerการตั้งค่า

ใครช่วยแสดงโค้ดตัวอย่างวิธีใช้AlarmManagerใน ِ Android ให้หน่อยได้ไหม

ฉันเล่นกับโค้ดมาสองสามวันแล้วและมันก็ใช้ไม่ได้

คำตอบ:


110

"บางตัวอย่างรหัส" AlarmManagerไม่ได้เป็นเรื่องง่ายเมื่อมันมาถึง

นี่คือตัวอย่างข้อมูลที่แสดงการตั้งค่าของ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);

ในตัวอย่างนี้ฉันใช้setRepeating()ไฟล์. set()ถ้าคุณต้องการปลุกยิงหนึ่งคุณก็จะใช้ set()ให้แน่ใจว่าจะให้เวลาสำหรับการเตือนภัยที่จะเริ่มต้นในฐานเวลาเดียวกับที่คุณใช้ในพารามิเตอร์เริ่มต้น ในตัวอย่างของฉันข้างต้นผมใช้เพื่อให้ฐานเวลาของฉันคือAlarmManager.ELAPSED_REALTIME_WAKEUPSystemClock.elapsedRealtime()

นี่คือโครงการตัวอย่างขนาดใหญ่ที่แสดงเทคนิคนี้


2
สวัสดีอีกครั้ง. ขอบคุณสำหรับการตอบกลับ. หากฉันซื้อหนังสือของคุณจะอธิบายวิธีใช้ตัวจัดการสัญญาณเตือนโดยละเอียดหรือไม่?
ทอม

7
หนังสือ Advanced Android (เวอร์ชัน 0.9) มี ~ 9 หน้าครอบคลุม AlarmManager, WakeLocks และส่วนที่เหลือของตัวอย่างนั้น นั่นอาจจะขยายได้เล็กน้อยในเวอร์ชัน 1.0 เมื่อฉันทำการแก้ไขที่ฉันได้กล่าวไว้ในคำตอบด้านบน และหากคุณมีคำถามเกี่ยวกับหนังสือเล่มนี้หรือรหัสตัวอย่างให้ไปที่groups.google.com/group/cw-androidเรายินดีที่จะตอบคำถามเหล่านี้
CommonsWare

17
นักพัฒนา Android ทุกคนควรสมัครสมาชิกหนังสือของ Mark :) อย่างน้อยหนึ่งครั้ง
Bostone

1
@ MarioGalván: คุณต้องตั้งค่าเมื่อแอปของคุณทำงานเป็นครั้งแรกและในการรีบูต
CommonsWare

ฉันคิดว่าคุณควรใช้ AlarmManager.RTC_WAKEUP ถ้าคุณต้องการให้มันเริ่มทำงานทันทีและทุก ๆ PERIOD ในรหัสของคุณจะเริ่มทำงานหลังจาก SystemClock.elapsedRealtime () และทุก ๆ PERIOD
Damon Yuan

66

มีตัวอย่างที่ดีในโค้ดตัวอย่างของ Android

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

สิ่งที่ต้องตรวจสอบ ได้แก่ :

  • AlarmController.java
  • OneShotAlarm.java

ก่อนอื่นคุณต้องมีเครื่องรับสัญญาณซึ่งสามารถฟังเสียงปลุกของคุณได้เมื่อถูกกระตุ้น เพิ่มสิ่งต่อไปนี้ในไฟล์ AndroidManifest.xml ของคุณ

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

จากนั้นสร้างคลาสต่อไปนี้

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

จากนั้นหากต้องการเริ่มการปลุกให้ใช้สิ่งต่อไปนี้ (เช่นในกิจกรรมหลักของคุณ):

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

.


หรือให้ดีกว่านั้นคือสร้างคลาสที่จัดการทั้งหมดแล้วใช้แบบนี้

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

ด้วยวิธีนี้คุณมีทุกอย่างในที่เดียว (อย่าลืมแก้ไข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();
     }
}

2
สวัสดี! ฉันทดสอบรหัสนี้แล้วและมันแย่มาก (+1) แต่ฉันลองใช้สิ่งนี้สำหรับการเตือนภัยหลายครั้ง (เช่นหนึ่งครั้งเป็นเวลา 10 วินาทีและอีกครั้งเป็นเวลา 15 วินาทีและมีเพียงวินาทีเดียวเท่านั้นที่ถูกยิงฉันทำอะไรผิดหรือเป็นราชาของปัญหาแก้ไข: โอเคฉันพบปัญหาที่นี่ : stackoverflow.com/questions/2844274/…
Nuno Gonçalves

FWIW ฉันจะใช้วิธีการคงที่มากกว่าตัวสร้างสำหรับสิ่งนี้
Edward Falk

9

สิ่งที่คุณต้องทำก่อนอื่นคือสร้างความตั้งใจที่คุณต้องการกำหนดเวลา จากนั้นรับ pendingIntent ของเจตนานั้น คุณสามารถกำหนดเวลากิจกรรมบริการและการออกอากาศ ในการกำหนดเวลากิจกรรมเช่น MyActivity:

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

ให้ pendingIntent นี้กับ 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);

ตอนนี้ MyActivity จะเปิดตัวหลังจาก 5 วินาทีของการเปิดแอปพลิเคชันไม่ว่าคุณจะหยุดแอปพลิเคชันหรืออุปกรณ์ของคุณเข้าสู่สถานะสลีป (เนื่องจากตัวเลือก RTC_WAKEUP) คุณสามารถอ่านโค้ดตัวอย่างที่สมบูรณ์กิจกรรมการจัดกำหนดการบริการและการออกอากาศ #Android


+1 คำตอบที่ดีสิ่งที่ฉันต้องการตัวอย่าง 'set' ที่ใช้งานได้
A. Alqadomi

4

ฉันต้องการแสดงความคิดเห็น แต่ <50 ตัวแทนดังนั้นนี่ไป การแจ้งเตือนอย่างเป็นมิตรว่าหากคุณใช้ระบบ 5.1 ขึ้นไปและคุณใช้ช่วงเวลาน้อยกว่าหนึ่งนาทีสิ่งนี้จะเกิดขึ้น:

Suspiciously short interval 5000 millis; expanding to 60 seconds

ดูที่นี่ .


3

โค้ดตัวอย่างบางส่วนเมื่อคุณต้องการเรียกใช้บริการจาก 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);

คุณไม่ต้องถามสิทธิ์ผู้ใช้


คำย่อที่ใช้บ่อยมาก
Phantômaxx

0

AlarmManager ใช้เพื่อทริกเกอร์โค้ดในช่วงเวลาที่กำหนด

ในการเริ่ม Alarm Manager คุณต้องรับอินสแตนซ์จากระบบก่อน จากนั้นส่ง PendingIntent ซึ่งจะดำเนินการในอนาคตที่คุณระบุ

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

คุณต้องระมัดระวังในขณะใช้ Alarm Manager โดยปกติตัวจัดการการเตือนจะไม่สามารถทำซ้ำก่อนหนึ่งนาที นอกจากนี้ในโหมดพลังงานต่ำระยะเวลาอาจเพิ่มขึ้นได้ถึง 15 นาที

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.