usando tutorial studio manager example ejemplo cancel alarma android alarmmanager

android - studio - tutorial alarmmanager



Ejemplo de administrador de alarmas (6)

Aquí hay un ejemplo bastante autónomo. Se vuelve rojo un botón después de 5 seg.

public void SetAlarm() { final Button button = buttons[2]; // replace with a button from your own UI BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive( Context context, Intent _ ) { button.setBackgroundColor( Color.RED ); context.unregisterReceiver( this ); // this == BroadcastReceiver, not Activity } }; this.registerReceiver( receiver, new IntentFilter("com.blah.blah.somemessage") ); PendingIntent pintent = PendingIntent.getBroadcast( this, 0, new Intent("com.blah.blah.somemessage"), 0 ); AlarmManager manager = (AlarmManager)(this.getSystemService( Context.ALARM_SERVICE )); // set alarm to fire 5 sec (1000*5) from now (SystemClock.elapsedRealtime()) manager.set( AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 1000*5, pintent ); }

Sin embargo, recuerde que el AlarmManager se activa incluso cuando su aplicación no se está ejecutando. Si llama a esta función y pulsa el botón Inicio, espere 5 segundos, luego vuelva a su aplicación, el botón se habrá vuelto rojo.

No sé qué tipo de comportamiento obtendría si su aplicación no estuviera en la memoria, así que tenga cuidado con el tipo de estado que trata de preservar.

Quiero implementar una función de programación en mi proyecto. Así que busqué en Google un programa de administrador de alarmas, pero no puedo encontrar ningún ejemplo.

¿Alguien puede ayudarme con un programa de administrador de alarmas básico?


Este código te ayudará a hacer una alarma de repetición. El tiempo de repetición puede establecer por usted.

activity_main.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:background="#000000" android:paddingTop="100dp"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" > <EditText android:id="@+id/ethr" android:layout_width="50dp" android:layout_height="wrap_content" android:ems="10" android:hint="Hr" android:singleLine="true" > <requestFocus /> </EditText> <EditText android:id="@+id/etmin" android:layout_width="55dp" android:layout_height="wrap_content" android:ems="10" android:hint="Min" android:singleLine="true" /> <EditText android:id="@+id/etsec" android:layout_width="50dp" android:layout_height="wrap_content" android:ems="10" android:hint="Sec" android:singleLine="true" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:paddingTop="10dp"> <Button android:id="@+id/setAlarm" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="onClickSetAlarm" android:text="Set Alarm" /> </LinearLayout> </LinearLayout>

MainActivity.java

public class MainActivity extends Activity { int hr = 0; int min = 0; int sec = 0; int result = 1; AlarmManager alarmManager; PendingIntent pendingIntent; BroadcastReceiver mReceiver; EditText ethr; EditText etmin; EditText etsec; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ethr = (EditText) findViewById(R.id.ethr); etmin = (EditText) findViewById(R.id.etmin); etsec = (EditText) findViewById(R.id.etsec); RegisterAlarmBroadcast(); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } @Override protected void onDestroy() { unregisterReceiver(mReceiver); super.onDestroy(); } public void onClickSetAlarm(View v) { String shr = ethr.getText().toString(); String smin = etmin.getText().toString(); String ssec = etsec.getText().toString(); if(shr.equals("")) hr = 0; else { hr = Integer.parseInt(ethr.getText().toString()); hr=hr*60*60*1000; } if(smin.equals("")) min = 0; else { min = Integer.parseInt(etmin.getText().toString()); min = min*60*1000; } if(ssec.equals("")) sec = 0; else { sec = Integer.parseInt(etsec.getText().toString()); sec = sec * 1000; } result = hr+min+sec; alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), result , pendingIntent); } private void RegisterAlarmBroadcast() { mReceiver = new BroadcastReceiver() { // private static final String TAG = "Alarm Example Receiver"; @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "Alarm time has been reached", Toast.LENGTH_LONG).show(); } }; registerReceiver(mReceiver, new IntentFilter("sample")); pendingIntent = PendingIntent.getBroadcast(this, 0, new Intent("sample"), 0); alarmManager = (AlarmManager)(this.getSystemService(Context.ALARM_SERVICE)); } private void UnregisterAlarmBroadcast() { alarmManager.cancel(pendingIntent); getBaseContext().unregisterReceiver(mReceiver); } }

Si necesita alarma solo por una vez, entonces reemplace

alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), result , pendingIntent);

con

alarmManager.set( AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + result , pendingIntent );


He hecho mi propia implementación para hacer esto de la manera más sencilla posible.

import android.app.AlarmManager; import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import junit.framework.Assert; /** * Created by Daniel on 28/08/2016. */ public abstract class AbstractSystemServiceTask { private final Context context; private final AlarmManager alarmManager; private final BroadcastReceiver broadcastReceiver; private final PendingIntent pendingIntent; public AbstractSystemServiceTask(final Context context, final String id, final long time, final AlarmType alarmType, final BackgroundTaskListener backgroundTaskListener) { Assert.assertNotNull("ApplicationContext can''t be null", context); Assert.assertNotNull("ID can''t be null", id); this.context = context; this.alarmManager = (AlarmManager) this.context.getSystemService(Context.ALARM_SERVICE); this.context.registerReceiver( this.broadcastReceiver = this.getBroadcastReceiver(backgroundTaskListener), new IntentFilter(id)); this.configAlarmManager( this.pendingIntent = PendingIntent.getBroadcast(this.context, 0, new Intent(id), 0), time, alarmType); } public void stop() { this.alarmManager.cancel(this.pendingIntent); this.context.unregisterReceiver(this.broadcastReceiver); } private BroadcastReceiver getBroadcastReceiver(final BackgroundTaskListener backgroundTaskListener) { Assert.assertNotNull("BackgroundTaskListener can''t be null.", backgroundTaskListener); return new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { backgroundTaskListener.perform(context, intent); } }; } private void configAlarmManager(final PendingIntent pendingIntent, final long time, final AlarmType alarmType) { long ensurePositiveTime = Math.max(time, 0L); switch (alarmType) { case REPEAT: this.alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), ensurePositiveTime, pendingIntent); break; case ONE_TIME: default: this.alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + ensurePositiveTime, pendingIntent); } } public interface BackgroundTaskListener { void perform(Context context, Intent intent); } public enum AlarmType { REPEAT, ONE_TIME; } }

El único siguiente paso, implementarlo.

import android.content.Context; import android.content.Intent; import android.util.Log; import ...AbstractSystemServiceTask; import java.util.concurrent.TimeUnit; /** * Created by Daniel on 28/08/2016. */ public class UpdateInfoSystemServiceTask extends AbstractSystemServiceTask { private final static String ID = "UPDATE_INFO_SYSTEM_SERVICE"; private final static long REPEAT_TIME = TimeUnit.SECONDS.toMillis(10); private final static AlarmType ALARM_TYPE = AlarmType.REPEAT; public UpdateInfoSystemServiceTask(Context context) { super(context, ID, REPEAT_TIME, ALARM_TYPE, new BackgroundTaskListener() { @Override public void perform(Context context, Intent intent) { Log.i("MyAppLog", "-----> UpdateInfoSystemServiceTask"); //DO HERE WHATEVER YOU WANT... } }); Log.i("MyAppLog", "UpdateInfoSystemServiceTask started."); } }

Me gusta trabajar con esta implementación, pero otra posible buena manera es no hacer AbstractSystemServiceTask clase AbstractSystemServiceTask, y construirla a través de un Builder.

Espero que te ayude.

ACTUALIZADO Mejorado para permitir varios BackgroundTaskListener en el mismo BroadCastReceiver .

import android.app.AlarmManager; import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import junit.framework.Assert; import java.util.HashSet; import java.util.Set; /** * Created by Daniel on 28/08/2016. */ public abstract class AbstractSystemServiceTask { private final Context context; private final AlarmManager alarmManager; private final BroadcastReceiver broadcastReceiver; private final PendingIntent pendingIntent; private final Set<BackgroundTaskListener> backgroundTaskListenerSet; public AbstractSystemServiceTask(final Context context, final String id, final long time, final AlarmType alarmType) { Assert.assertNotNull("ApplicationContext can''t be null", context); Assert.assertNotNull("ID can''t be null", id); this.backgroundTaskListenerSet = new HashSet<>(); this.context = context; this.alarmManager = (AlarmManager) this.context.getSystemService(Context.ALARM_SERVICE); this.context.registerReceiver( this.broadcastReceiver = this.getBroadcastReceiver(), new IntentFilter(id)); this.configAlarmManager( this.pendingIntent = PendingIntent.getBroadcast(this.context, 0, new Intent(id), 0), time, alarmType); } public synchronized void registerTask(final BackgroundTaskListener backgroundTaskListener) { Assert.assertNotNull("BackgroundTaskListener can''t be null", backgroundTaskListener); this.backgroundTaskListenerSet.add(backgroundTaskListener); } public synchronized void removeTask(final BackgroundTaskListener backgroundTaskListener) { Assert.assertNotNull("BackgroundTaskListener can''t be null", backgroundTaskListener); this.backgroundTaskListenerSet.remove(backgroundTaskListener); } public void stop() { this.backgroundTaskListenerSet.clear(); this.alarmManager.cancel(this.pendingIntent); this.context.unregisterReceiver(this.broadcastReceiver); } private BroadcastReceiver getBroadcastReceiver() { return new BroadcastReceiver() { @Override public void onReceive(final Context context, final Intent intent) { for (BackgroundTaskListener backgroundTaskListener : AbstractSystemServiceTask.this.backgroundTaskListenerSet) { backgroundTaskListener.perform(context, intent); } } }; } private void configAlarmManager(final PendingIntent pendingIntent, final long time, final AlarmType alarmType) { long ensurePositiveTime = Math.max(time, 0L); switch (alarmType) { case REPEAT: this.alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), ensurePositiveTime, pendingIntent); break; case ONE_TIME: default: this.alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + ensurePositiveTime, pendingIntent); } } public interface BackgroundTaskListener { void perform(Context context, Intent intent); } public enum AlarmType { REPEAT, ONE_TIME; } }


MainActivity.java

package com.example.alarmexample; import android.app.Activity; import android.app.AlarmManager; import android.app.PendingIntent; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class MainActivity extends Activity { Button b1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); startAlert(); } public void startAlert() { int timeInSec = 2; Intent intent = new Intent(this, MyBroadcastReceiver.class); PendingIntent pendingIntent = PendingIntent.getBroadcast( this.getApplicationContext(), 234, intent, 0); AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (timeInSec * 1000), pendingIntent); Toast.makeText(this, "Alarm set to after " + i + " seconds",Toast.LENGTH_LONG).show(); } }

MyBroadcastReceiver.java

package com.example.alarmexample; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.media.MediaPlayer; import android.widget.Toast; public class MyBroadcastReceiver extends BroadcastReceiver { MediaPlayer mp; @Override public void onReceive(Context context, Intent intent) { mp=MediaPlayer.create(context, R.raw.alarm); mp.start(); Toast.makeText(context, "Alarm", Toast.LENGTH_LONG).show(); } }

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.alarmexample" > <uses-permission android:name="android.permission.VIBRATE" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.alarmexample.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <receiver android:name="MyBroadcastReceiver" > </receiver> </application> </manifest>


Probé la solución de XXX y, aunque inicialmente funcionó, en algún momento dejó de funcionar. El onReceive nunca fue llamado de nuevo. Pasé horas tratando de averiguar qué podría ser. Lo que me di cuenta es que ya no se llamaba la Intent por alguna razón misteriosa. Para solucionar esto, descubrí que realmente necesitas especificar una acción para el receptor en el manifiesto. Ejemplo:

<receiver android:name=".Alarm" android:exported="true"> <intent-filter> <action android:name="mypackage.START_ALARM" > </action> </intent-filter> </receiver>

Tenga en cuenta que el nombre es ".Alarm" con el punto. En el método setAlarm de XXX, crea la Intent siguiente manera:

Intent i = new Intent("mypackage.START_ALARM");

El mensaje START_ALARM puede ser lo que quieras que sea. Acabo de darle ese nombre para propósitos de demostración.

No he visto receptores definidos en el manifiesto sin un filtro de intención que especifique la acción. Crearlos de la forma en que XXX lo ha especificado parece un poco falso. Al especificar el nombre de la acción, se obligará a Android a crear una instancia de BroadcastReceiver utilizando la clase que corresponde a la acción. Si confía en el contexto, tenga en cuenta que Android tiene varios objetos diferentes que TODOS se denominan contexto y pueden no resultar en la creación de su BroadcastReceiver . Forzar a Android a crear una instancia de su clase usando solo el mensaje de acción es mucho mejor que confiar en algún contexto dudoso que quizás nunca funcione.


Este es el código de trabajo. Despierta la CPU cada 10 minutos hasta que el teléfono se apaga.

Añadir a Manifest.xml:

... <uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission> ... <receiver android:process=":remote" android:name=".Alarm"></receiver> ...

Código en tu clase:

package yourPackage; import android.app.AlarmManager; import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.PowerManager; import android.widget.Toast; public class Alarm extends BroadcastReceiver { @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, ""); wl.acquire(); // Put here YOUR code. Toast.makeText(context, "Alarm !!!!!!!!!!", Toast.LENGTH_LONG).show(); // For example wl.release(); } public void setAlarm(Context context) { AlarmManager am =( AlarmManager)context.getSystemService(Context.ALARM_SERVICE); Intent i = new Intent(context, Alarm.class); PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0); am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * 60 * 10, pi); // Millisec * Second * Minute } public void cancelAlarm(Context context) { Intent intent = new Intent(context, Alarm.class); PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0); AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); alarmManager.cancel(sender); } }

Establecer alarma de servicio:

package yourPackage; import android.app.Service; import android.content.Context; import android.content.Intent; import android.os.IBinder; public class YourService extends Service { Alarm alarm = new Alarm(); public void onCreate() { super.onCreate(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { alarm.setAlarm(this); return START_STICKY; } @Override public void onStart(Intent intent, int startId) { alarm.setAlarm(this); } @Override public IBinder onBind(Intent intent) { return null; } }

Si desea configurar la repetición de la alarma en el momento de arranque del teléfono:

Agregue el permiso y el servicio a Manifest.xml:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission> ... <receiver android:name=".AutoStart"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"></action> </intent-filter> </receiver> ... <service android:name=".YourService" android:enabled="true" android:process=":your_service" > </service>

Y crear una nueva clase:

package yourPackage; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; public class AutoStart extends BroadcastReceiver { Alarm alarm = new Alarm(); @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) { alarm.setAlarm(context); } } }