No se puede comprobar si AlarmManager ha configurado la alarma

Estoy comprobando si la alarma ya ha sido configurada por el AlarmManager usando esta respuesta .

El siguiente es mi fragmento de código.

boolean alarmUp = (PendingIntent.getBroadcast(MainActivity.this, 0, new Intent(MainActivity.this, AlarmReceiver.class), PendingIntent.FLAG_NO_CREATE) != null); if (alarmUp) { // alarm is set; do some stuff } Intent alarmIntent = new Intent(MainActivity.this, AlarmReceiver.class); final PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT); AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); manager.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 10 * 1000, pendingIntent); 

Sin embargo, alarmUp siempre se establece como true. Es decir, si fijo la alarma o no, siempre que recomiendo mi app, me dice que alarmUp es verdad (estoy comprobando él haciendo un Toast ).

Por favor, ayúdeme a dónde voy mal.

Para que esta comprobación funcione, debe estar absolutamente seguro de que PendingIntent sólo existe cuando se establece la alarma. Hay dos cosas que usted puede hacer para asegurarse de que es así:

1) Al probar su código, asegúrese de desinstalar su aplicación y, a continuación, vuelva a instalar la aplicación antes de probarla. La desinstalación de la aplicación eliminará cualquier PendingIntent que su aplicación pueda haber creado y que aún estén pendientes.

2) Cuando cancele la alarma, asegúrese de cancelar también el PendingIntent . Puedes hacerlo con

 Intent alarmIntent = new Intent(MainActivity.this, AlarmReceiver.class); final PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, alarmIntent, PendingIntent.FLAG_NO_CREATE); if (pendingIntent != null) { pendingIntent.cancel(); } 

Puesto que la API 21 puede utilizar

 public AlarmManager.AlarmClockInfo getNextAlarmClock () 

http://developer.android.com/reference/android/app/AlarmManager.html#getNextAlarmClock ()


Ahora, el código que está intentando utilizar:

 (PendingIntent.getBroadcast(MainActivity.this, 0, new Intent(MainActivity.this, AlarmReceiver.class), PendingIntent.FLAG_NO_CREATE) != null); 

Bassically usted está pidiendo un previus y una intención existente llamada AlarmReceiver. Pero su AlarmReceiver se refiere a su propio BroadcastReceiver.

Como puede ver en esta línea de la respuesta que publicó antes:

 boolean alarmUp = (PendingIntent.getBroadcast(context, 0, new Intent("com.my.package.MY_UNIQUE_ACTION"), PendingIntent.FLAG_NO_CREATE) != null); 

Utilizan "MY_UNIQUE_ACTION" para ver si existe la intención.

También en este sitio usted puede ver un tutorial usando eso:

http://justcallmebrian.com/2010/04/27/using-alarmmanager-to-schedule-activities-on-android/


A menos que pueda acceder al AlarmReceiver del sistema android y ver si existe la intención, no podrá solicitar una alarma programada "genérica". ¿Es eso lo que estás tratando de hacer? Si es el caso, ¿está seguro de que en caso de que usted no tiene ninguna alarma programada la intención AlarmReceiver sistema de Android no fue creado por el sistema de todos modos? Parece que no tenemos control a esos componentes como nos gusta.


Un ejemplo de trabajo: Manifest.xml:

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

MySuperReceiver.java

 package com.blablabla.testa; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.util.Log; import java.util.Calendar; public class MySuperReceiver extends BroadcastReceiver { public static final String TAG = MySuperReceiver.class.getSimpleName(); public static final String ACTION_ALARM_RECEIVER = "ACTION_ALARM_RECEIVER"; private Calendar c = Calendar.getInstance(); @Override public void onReceive(Context context, Intent intent) { if (intent != null) if (ACTION_ALARM_RECEIVER.equals(intent.getAction())) { Log.d(TAG, new Exception().getStackTrace()[0].getMethodName() + " " + c.getTime()); //do something here } } } 

Y MainActivity.java:

 package com.blablabla.testa; import android.app.AlarmManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.MenuItem; public class MainActivity extends ActionBarActivity { public static final String TAG = "TEST APP:"; AlarmManager alarmManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); GetAlarmService(); CreateAlarm(); CheckForAlarm(); CancelAlarms(); CheckForAlarm(); } private void GetAlarmService() { alarmManager = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE); Log.d(TAG, " GET Alarm Service ! "); } private void CreateAlarm() { long aroundInterval = 1*60*1000; Intent intent = new Intent(getApplicationContext(), MySuperReceiver.class); intent.setAction(MySuperReceiver.ACTION_ALARM_RECEIVER);//my custom string action name PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 1001, intent, PendingIntent.FLAG_CANCEL_CURRENT);//used unique ID as 1001 alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), aroundInterval, pendingIntent);//first start will start asap Log.d(TAG, " CREATE Alarm ! "); } private void CancelAlarms() { Intent intent = new Intent(getApplicationContext(), MySuperReceiver.class);//the same as up intent.setAction(MySuperReceiver.ACTION_ALARM_RECEIVER);//the same as up PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 1001, intent, PendingIntent.FLAG_CANCEL_CURRENT);//the same as up alarmManager.cancel(pendingIntent);//important pendingIntent.cancel();//important Log.d(TAG, " Cancel Alarm ! "); } private void CheckForAlarm() { //checking if alarm is working with pendingIntent #3 Intent intent = new Intent(getApplicationContext() , MySuperReceiver.class);//the same as up intent.setAction(MySuperReceiver.ACTION_ALARM_RECEIVER);//the same as up boolean isWorking = (PendingIntent.getBroadcast(getApplicationContext() , 1001, intent, PendingIntent.FLAG_NO_CREATE) != null);//just changed the flag Log.d("TAG: TEST APP: ", "alarm is " + (isWorking ? "" : "not") + " working..."); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } } 
  • Servicio de fondo en Android - Necesita ayuda
  • ¿Cómo utilizo Android SpeechRecognizer como servicio?
  • ¿Cómo iniciar y detener el servicio de Android desde una shell de anuncios?
  • Android API21: VoiceInteractionService onReady () no se llama
  • Thread, Asynctask o intentService para mi aplicación?
  • Servicio y un BroadCastReceiver
  • Detener servicio cuando la aplicación está cerrada
  • Cómo obtener un Broadcastreceiver fiable
  • Silencio de Google Iniciar sesión en el servicio de fondo Android
  • El sistema Android eliminó mi servicio cuando borro todas las aplicaciones recientes
  • ¿Comunicación Bluetooth en hilo o servicio en Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.