5
http://code4reference.com/2012/07/tutorial-on-android-alarmmanager/ http://www.rafaeltoledo.net/tutorial-android-20-alarmes/ http://www.botecodigital.info/android/agendando-tarefas-no-android/ http://thatsjavainfo.com/android-tutorials/android-alarmmanager/ ============================= Android Alarm Manager -------------------- No momento de desenvolvimento de um aplicativo, frequentemente surge a necessida de de agendar a execução de código no futuro. É possível utilizar a classe AlarmManager pa ra essa finalidade, executar uma tarefa em um determinado momento. O AlarmManage r permite agendar a execução mesmo quando o aplicativo não está rodando. - AlarmManager O AlarmManager tem acesso aos serviços de alarme do sistema. Com a ajuda do AlarmM anager é possível agendar a execução de código no futuro. Não é possível instanciar esta cl diretamente, mas pode ser obtida uma instância da mesma através de uma chamada para Context.getSystemService(Context.ALARM_SERVICE). O AlarmManager é sempre registrado com um aintent. Quando um alarme é acionado, a in tent que foi registrada com o AlarmManager é transmitida pelo sistema automaticame nte. Essa intent inicializa a aplicação alvo caso a mesma não esteja em execução. Métodos da Classe AmarmManager: ---------------------- set() Schedules an alarm for one time. ---------------------- setInexactRepeating() Schedules an alarm with inexact repeating. Trigger time doesn t follow any strict restriction. ---------------------- setRepeating() Schedules an alarm with exact repeating time. ---------------------- setTime() Sets the system s wall clock time. ---------------------- setTimeZone() Sets the system s default time zone. ---------------------- Vamos criar um projeto de exemplo que cria um timer de execução única e um de repetição, e também uma forma de cancelar a repetição.

08 Android Alarme

Embed Size (px)

DESCRIPTION

08 Android Alarme

Citation preview

Page 1: 08 Android Alarme

http://code4reference.com/2012/07/tutorial-on-android-alarmmanager/

http://www.rafaeltoledo.net/tutorial-android-20-alarmes/

http://www.botecodigital.info/android/agendando-tarefas-no-android/

http://thatsjavainfo.com/android-tutorials/android-alarmmanager/

=============================

Android Alarm Manager--------------------

No momento de desenvolvimento de um aplicativo, frequentemente surge a necessidade de agendar a execução de código no futuro. É possível utilizar a classe AlarmManager para essa finalidade, executar uma tarefa em um determinado momento. O AlarmManager permite agendar a execução mesmo quando o aplicativo não está rodando.

- AlarmManager

O AlarmManager tem acesso aos serviços de alarme do sistema. Com a ajuda do AlarmManager é possível agendar a execução de código no futuro. Não é possível instanciar esta cladiretamente, mas pode ser obtida uma instância da mesma através de uma chamada para Context.getSystemService(Context.ALARM_SERVICE).

O AlarmManager é sempre registrado com um aintent. Quando um alarme é acionado, a intent que foi registrada com o AlarmManager é transmitida pelo sistema automaticamente. Essa intent inicializa a aplicação alvo caso a mesma não esteja em execução.

Métodos da Classe AmarmManager:

----------------------set()

Schedules an alarm for one time.

----------------------setInexactRepeating()

Schedules an alarm with inexact repeating. Trigger time doesn�t follow any strict restriction.----------------------setRepeating()

Schedules an alarm with exact repeating time.----------------------setTime()

Sets the system�s wall clock time.----------------------setTimeZone()

Sets the system�s default time zone.----------------------

Vamos criar um projeto de exemplo que cria um timer de execução única e um de repetição, e também uma forma de cancelar a repetição.

Page 2: 08 Android Alarme

####layout_main.xml

<linearlayout android:layout_height="match_parent" android:layout_width="match_parent" android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <button android:id="@+id/btStart" android:layout_height="wrap_content" android:layout_width="match_parent" android:onclick="startRepeatingTimer" android:padding="@dimen/padding_medium" android:text="@string/btStart" tools:context=".WidgetAlarmManagerActivity"/> <button android:id="@+id/btCancel" android:layout_height="wrap_content" android:layout_width="match_parent" android:onclick="cancelRepeatingTimer" android:padding="@dimen/padding_medium" android:text="@string/btCancel" tools:context=".WidgetAlarmManagerActivity"/> <button android:id="@+id/btOneTime" android:layout_height="wrap_content" android:layout_width="match_parent" android:onclick="onetimeTimer" android:padding="@dimen/padding_medium" android:text="@string/btOneTime" tools:context=".WidgetAlarmManagerActivity"/> </linearlayout>####

Vamos definir um BroadcastReceiver que lida com a intent registrada com o AlarmManager. Nessa classe o método onReceive() foi definido. Esse método é invocado assim que a intent é recebida. Uma vez que a intent é recebida, tentamos obter o parâmetro extra asssociado com esta intent. Esse parâmetro é definido pelo usuário (into é, ONE_TIME basicamente indica se a intent foi associada com um timer único ou um de repetição).

Uma vez que o parâmetro ONE_TIME tenha sido extraído, uma notificação é exibida de acordo. Alguns métodos auziliares também foram definidos para serem usados em outros locais com a ajuda de objetos (são eles: setAlarm(), cancelAlarm() and onetimeTimer().

#####package com.rakesh.alarmmanagerexample; import java.text.Format;import java.text.SimpleDateFormat;import java.util.Date; import android.app.AlarmManager;import android.app.PendingIntent;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.os.Bundle;import android.os.PowerManager;import android.widget.Toast; public class AlarmManagerBroadcastReceiver extends BroadcastReceiver { final public static String ONE_TIME = "onetime"; @Override public void onReceive(Context context, Intent intent) { PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "YOUR TAG");

Page 3: 08 Android Alarme

//Acquire the lock wl.acquire(); //You can do the processing here. Bundle extras = intent.getExtras(); StringBuilder msgStr = new StringBuilder(); if(extras != null && extras.getBoolean(ONE_TIME, Boolean.FALSE)){ //Make sure this intent has been sent by the one-time timer button. msgStr.append("One time Timer : "); } Format formatter = new SimpleDateFormat("hh:mm:ss a"); msgStr.append(formatter.format(new Date())); Toast.makeText(context, msgStr, Toast.LENGTH_LONG).show(); //Release the lock wl.release(); } public void SetAlarm(Context context) { AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class); intent.putExtra(ONE_TIME, Boolean.FALSE); PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0); //After after 5 seconds am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * 5 , pi); } public void CancelAlarm(Context context) { Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class); PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0); AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); alarmManager.cancel(sender); } public void setOnetimeTimer(Context context){ AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class); intent.putExtra(ONE_TIME, Boolean.TRUE); PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0); am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), pi); }}#####

setAlarm() - Esse método define a repetição do alarme usando o método setRepeating(), com quatro argumentos:

Page 4: 08 Android Alarme

1. O tipo do alarme2. A hora de acionamento3. O intervalo em milisegundos4. A intent registrada ao evento

cancelAlarm() - Esse método cancela o alarme registrado anteriormente através da chamada ao método cancel(). Ele recebe como argumento a intent que foi registrada, e tem que ser a mesma para que o mesmo consiga remover o alarme do sistema.

onetimeTimer() - Esse método cria um alarme único. Ele o faz através do médodo set() que recebe três argumentos:

1. O tipo do alarme2. A hora de acionamento3. A intent registrada ao evento

A seguir temos o arquivo de manifesto. Nele colocamos a permissão WAKE_LOCK porque esse recurso está sendo usado no método onReceive() na classe do BroadcastReceiver criada.

####<manifest android:versioncode="1" android:versionname="1.0" package="com.rakesh.alarmmanagerexample" xmlns:android="http://schemas.android.com/apk/res/android"> <uses-sdk android:minsdkversion="10" android:targetsdkversion="15"/> <uses-permission android:name="android.permission.WAKE_LOCK"/> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme"> <activity android:label="@string/title_activity_alarm_manager" android:name="com.rakesh.alarmmanagerexample.AlarmManagerActivity"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <receiver android:name="com.rakesh.alarmmanagerexample.AlarmManagerBroadcastReceiver"> </receiver> </application></manifest>######

Por fim, escrevemos a activity principal:

####package com.rakesh.alarmmanagerexample; import com.rakesh.alarmmanagerexample.R;import android.os.Bundle;import android.app.Activity;import android.content.Context;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.widget.Toast;import android.support.v4.app.NavUtils; public class AlarmManagerActivity extends Activity {

Page 5: 08 Android Alarme

private AlarmManagerBroadcastReceiver alarm; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_alarm_manager); alarm = new AlarmManagerBroadcastReceiver(); } @Override protected void onStart() { super.onStart(); } public void startRepeatingTimer(View view) { Context context = this.getApplicationContext(); if(alarm != null){ alarm.SetAlarm(context); }else{ Toast.makeText(context, "Alarm is null", Toast.LENGTH_SHORT).show(); } } public void cancelRepeatingTimer(View view){ Context context = this.getApplicationContext(); if(alarm != null){ alarm.CancelAlarm(context); }else{ Toast.makeText(context, "Alarm is null", Toast.LENGTH_SHORT).show(); } } public void onetimeTimer(View view){ Context context = this.getApplicationContext(); if(alarm != null){ alarm.setOnetimeTimer(context); }else{ Toast.makeText(context, "Alarm is null", Toast.LENGTH_SHORT).show(); } } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_widget_alarm_manager, menu); return true; }}######