Android : AlarmManager 사용 방법


89

AlarmManager설정 후 20 분 후에 코드 블록을 트리거해야합니다 .

누군가 AlarmManagerِ Android에서 를 사용하는 방법에 대한 샘플 코드를 보여줄 수 있습니까 ?

나는 며칠 동안 몇 가지 코드를 가지고 놀았지만 작동하지 않습니다.

답변:


109

"일부 샘플 코드"는 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_WAKEUP하고 있으므로 시간축은 SystemClock.elapsedRealtime().

다음은 이 기술을 보여주는 더 큰 샘플 프로젝트 입니다.


2
또 안녕. 답장을 보내 주셔서 감사합니다. 책을 구입하면 알람 관리자를 구현하는 방법에 대해 자세히 설명합니까?
Tom

7
Advanced Android 책 (버전 0.9)에는 AlarmManager, WakeLocks 및 해당 예제의 나머지 부분을 다루는 최대 9 페이지가 있습니다. 위에서 언급 한 수정 사항을 수정하면 버전 1.0에서 약간 확장 될 것입니다. 책이나 샘플 코드와 관련하여 질문이있는 경우 groups.google.com/group/cw-android로 이동 하면 기꺼이 답변 해 드리겠습니다.
CommonsWare

17
모든 안드로이드 개발자는 Mark의 책을 구독해야합니다. :) 최소한 한 번
Bostone 2010

1
@ MarioGalván : 앱을 처음 실행하고 재부팅 할 때 설정해야합니다.
CommonsWare

즉시 실행하고 모든 PERIOD를 실행하려면 AlarmManager.RTC_WAKEUP를 사용해야한다고 생각합니다. 귀하의 코드에서 SystemClock.elapsedRealtime () 및 매 PERIOD 이후에 실행됩니다.
데이먼 위안

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 초 동안 다른 하나는 sencond 하나만 실행됩니다. 내가 뭔가 잘못하고 있습니까, 아니면 문제의 왕입니까? 편집 : 좋아, 여기에서 문제를 발견했습니다. : stackoverflow.com/questions/2844274/…
Nuno Gonçalves

FWIW, 나는 이것을 위해 생성자 대신 정적 메서드를 사용합니다.
Edward Falk 2015

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는 응용 프로그램을 중지하거나 장치가 절전 상태 에 있더라도 (RTC_WAKEUP 옵션으로 인해) 응용 프로그램 시작 5 초 후에 시작 됩니다. 전체 예제 코드를 읽을 수 있습니다. 예약 활동, 서비스 및 방송 #Android


+1 훌륭한 답변, 정확히 내가 필요한 것, 작동하는 '세트'예제.
A.Alqadomi

4

나는 댓글을 달고 싶었지만 <50 rep, 그래서 여기에 간다. 5.1 이상에서 실행 중이고 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는 특정 시간에 일부 코드를 트리거하는 데 사용됩니다.

알람 관리자를 시작하려면 먼저 시스템에서 인스턴스를 가져와야합니다. 그런 다음 나중에 지정한 시간에 실행될 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);

알람 관리자를 사용하는 동안주의해야합니다. 일반적으로 알람 관리자는 1 분 전에 반복 할 수 없습니다. 저전력 모드에서도 지속 시간이 최대 15 분까지 늘어날 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.