Pergunta

Eu preciso para acionar um bloco de código depois de 20 minutos do AlarmManager sendo definido.

Alguém pode me mostrar código de exemplo sobre como usar um AlarmManager no Android?

Eu tenho jogado ao redor com algum código por alguns dias e ele simplesmente não vai funcionar.

Foi útil?

Solução

"Um código de exemplo" que não é fácil quando se trata de AlarmManager.

Aqui está um trecho mostrando a configuração do 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);

Neste exemplo, estou usando setRepeating(). Se você quer um alarme one-shot, você iria usar apenas set(). Certifique-se de dar tempo para o alarme para começar na mesma base de tempo que você usa no parâmetro inicial para set(). No meu exemplo acima, eu estou usando AlarmManager.ELAPSED_REALTIME_WAKEUP, por isso a minha base de tempo é SystemClock.elapsedRealtime().

Aqui é um projeto de amostra maior mostrando esta técnica.

Outras dicas

Há alguns bons exemplos no código de exemplo android

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

Os únicos a verificar se estão:

  • AlarmController.java
  • OneShotAlarm.java

Primeiro, você precisa de um receptor, algo que pode ouvir o seu alarme quando ele é acionado. Adicione o seguinte ao seu arquivo AndroidManifest.xml

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

Em seguida, crie a seguinte classe

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

Então, para disparar um alarme, use o seguinte (por exemplo, em sua atividade principal):

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

.


Ou, melhor ainda, fazer uma classe que lida com tudo isso e usá-lo como este

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

Desta forma, você tem tudo isso em um só lugar (não se esqueça de editar o 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();
     }
}

O que você precisa fazer é primeiro criar a intenção é preciso programação. Em seguida, obter o pendingIntent dessa intenção. Você pode agendar atividades, serviços e transmissões. Para agendar uma atividade por exemplo MyActivity:

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

Dê este pendingIntent para 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);

Agora MyActivity será lançado depois de 5 segundos após o lançamento do aplicativo, não importa que você parar o seu aplicativo ou dispositivo foi no estado de suspensão (opção RTC_WAKEUP devido). Você pode ler o código completo exemplo programação de atividades, serviços e transmissões #android

Eu queria comentário, mas <50 rep, então aqui vai. lembrete amigável que se você está rodando em 5,1 ou acima e você usar um intervalo de menos de um minuto, isso acontece:

Suspiciously short interval 5000 millis; expanding to 60 seconds

aqui .

Um código de exemplo, quando você quiser chamar um serviço da 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);

Você não tem que pedir userpermissions.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top