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.
- Android bluetooth SDP no reconoce el servicio anunciado en JAVAME
- Actualizar MusicPlayer SeekBar en servicio
- Problemas con SharedPreferences en un servicio (getPreferences no existe en un servicio)
- Dentro de una aplicación, ¿funcionará la actividad y el servicio en el mismo proceso?
- ¿Necesito agregar un filtro de intenciones al iniciar un servicio?
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.
- Servicio externo de Android desde una biblioteca (AAR, no Shared Service)
- Obtener una vista de AccessibilityNodeInfo para crear superposición
- Cómo obtener el contexto de la aplicación
- Opcionalmente, iniciar actividades y utilizar notificaciones de servicios en Android. Sólo lanzar o notificar si una determinada aplicación está presente
- Servicio en android?
- ¿Cómo reiniciar un servicio muerto automáticamente?
- No se le permite enlazar con el servicio
- Excepción de puntero nulo iniciando IntentService
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); } }
- ¿Cómo crear PDF desde webview en android?
- Android Studio 1.5 – Cómo mostrar javadoc para los servicios de Google Play en AS