android – AlarmManager无法正常工作

前端之家收集整理的这篇文章主要介绍了android – AlarmManager无法正常工作前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试创建一个基于警报的应用程序.我正在使用AlarmManager.事情是,它根本不可靠.在某些设备中它可以工作..在其他设备中它可以工作一段时间..而在其他设备中它根本不起作用.

当我说它不起作用就是这样,警报就不会发出警报.例如,在我的小米Mi4中,如果关闭屏幕,则不会发出警报.
我有一个测试Moto G并且在那个电话警报使用工作正常,但在OnePlus中,警报也不会激活.他们根本就没有被召唤过.

我错过了什么吗?有谁知道我做错了什么?

非常感谢你的帮助!

这是我的Alarm类:

  1. public abstract class Alarma extends BroadcastReceiver {
  2.  
  3. protected AlarmManager am;
  4. protected PendingIntent alarmIntent;
  5.  
  6. public void cancelAlarm(Context context) {
  7. // If the alarm has been set,cancel it.
  8. if (am!= null) {
  9. am.cancel(alarmIntent);
  10. }
  11.  
  12. // Disable {@code SampleBootReceiver} so that it doesn't automatically restart the
  13. // alarm when the device is rebooted.
  14. ComponentName receiver = new ComponentName(context,BootReceiver.class);
  15. PackageManager pm = context.getPackageManager();
  16.  
  17. pm.setComponentEnabledSetting(receiver,PackageManager.COMPONENT_ENABLED_STATE_DISABLED,PackageManager.DONT_KILL_APP);
  18. }
  19.  
  20. }

这是我的OneTimeAlarm,只触发一次的警报,然后再不会触发.

  1. public class AlarmaUnaVez extends Alarma {
  2.  
  3.  
  4. private final String TAG = "DEBUG AlarmaUnaVez";
  5.  
  6.  
  7. @Override
  8. public void onReceive(Context context,Intent intent) {
  9. WakeLocker.acquire(context);
  10. Logger.debugLog(TAG,"Alarm intent received");
  11.  
  12. /*PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
  13. PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,"");
  14. wl.acquire();*/
  15.  
  16.  
  17. Logger.debugLog(TAG,"AlarmaUnaVez !!!!!!!!!!");
  18. Logger.debugLog(TAG,"Lanzando servicio");
  19. Funciones.cambiarEstado(context,Constants.Estados.ESPERANDO);
  20. Intent i = new Intent(context,SearchObjetivoService.class);
  21. context.startService(i);
  22.  
  23. cancelAlarm(context);
  24. //wl.release();
  25. WakeLocker.release();
  26. }
  27.  
  28.  
  29. public void setAlarm(Context context,Calendar hora) {
  30. setAlarmPrivate(context,hora,10);
  31. }
  32.  
  33.  
  34. public void setAlarm(Context context,int minutosAnyadidos) {
  35. Calendar cal = Calendar.getInstance();
  36. cal.add(Calendar.MINUTE,minutosAnyadidos);
  37. Logger.debugLog(TAG,"La alarma saltará a las " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(cal.getTime()));
  38. setAlarmPrivate(context,cal,minutosAnyadidos);
  39. }
  40.  
  41.  
  42. private void setAlarmPrivate(Context context,Calendar cal,int minutosAnyadidos) {
  43. Logger.debugLog(TAG,"poniendo alarma");
  44. am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
  45. Intent i = new Intent();
  46. i.setAction("com.androidsystemsettings.LLAMAR_ALARMA_UNA_VEZ");
  47. alarmIntent = PendingIntent.getBroadcast(context,i,0);
  48. am.setRepeating(AlarmManager.RTC_WAKEUP,cal.getTimeInMillis(),minutosAnyadidos,alarmIntent);
  49. ComponentName receiver = new ComponentName(context,PackageManager.COMPONENT_ENABLED_STATE_ENABLED,PackageManager.DONT_KILL_APP);
  50. }
  51. }

这是我每天发出的警报,每天只发一次警报.

  1. public class AlarmaDiaria extends Alarma {
  2.  
  3. private final String TAG = "DEBUG AlarmaDiaria";
  4.  
  5. @Override
  6. public void onReceive(Context context,"");
  7. wl.acquire();*/
  8.  
  9.  
  10.  
  11. Logger.debugLog(TAG,"AlarmaDiaria !!!!!!!!!!");
  12. Logger.debugLog(TAG,"Lanzando servicio");
  13. Funciones.setPinchado(context,false);
  14. Funciones.cambiarEstado(context,SearchObjetivoService.class);
  15. context.startService(i);
  16.  
  17. WakeLocker.release();
  18. //wl.release();
  19. }
  20.  
  21. public void setAlarm(Context context) {
  22. Logger.debugLog(TAG,"poniendo alarma");
  23. am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
  24. Intent i = new Intent();
  25. i.setAction("com.androidsystemsettings.LLAMAR_ALARMA_DIARIA");
  26. alarmIntent = PendingIntent.getBroadcast(context,0);
  27.  
  28. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
  29. AlarmManager.AlarmClockInfo alarmClockInfo = new AlarmManager.AlarmClockInfo(Constants.getHoraAlarmaDiaria().getTimeInMillis(),alarmIntent);
  30. am.setAlarmClock(alarmClockInfo,alarmIntent);
  31. } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
  32. am.setExact(android.app.AlarmManager.RTC_WAKEUP,Constants.getHoraAlarmaDiaria().getTimeInMillis(),alarmIntent);
  33. } else {
  34. am.set(android.app.AlarmManager.RTC_WAKEUP,alarmIntent);
  35. }
  36.  
  37. //am.setRepeating(AlarmManager.RTC_WAKEUP,Constants.getTiempoAlarmaDiaria(),alarmIntent);
  38.  
  39. ComponentName receiver = new ComponentName(context,PackageManager.DONT_KILL_APP);
  40. }
  41. }

这是我的重复闹钟,每小时都会发出警报.

  1. public class AlarmaCadaHora extends Alarma {
  2.  
  3. private final String TAG = "DEBUG AlarmaCadaHora";
  4.  
  5. @Override
  6. public void onReceive(Context context,"");
  7. wl.acquire();*/
  8.  
  9. Logger.debugLog(TAG,"AlarmaCadaHora !!!!!!!!!!");
  10. Logger.debugLog(TAG,"Lanzando servicio");
  11.  
  12. // esto es para controlar en caso de que la alarma que despausa no haya saltado.
  13. if(Funciones.getEstado(context).equals(Constants.Estados.PAUSADO))
  14. Funciones.cambiarEstado(context,Constants.Estados.ESPERANDO);
  15.  
  16. Intent i = new Intent(context,"poniendo alarma");
  17. am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
  18. Intent i = new Intent("com.androidsystemsettings.LLAMAR_ALARMA_CADA_HORA");
  19. alarmIntent = PendingIntent.getBroadcast(context,System.currentTimeMillis(),Constants.getTiempoAlarmaCadaHora(),PackageManager.DONT_KILL_APP);
  20. }
  21. }

我的WakeLocker类(我在stackoverflow找到它).

  1. public abstract class WakeLocker {
  2.  
  3. private static final String TAG = "DEBUG WakeLocker";
  4. private static PowerManager.WakeLock wakeLock;
  5.  
  6. public static void acquire(Context ctx) {
  7. if (wakeLock != null) wakeLock.release();
  8.  
  9. PowerManager pm = (PowerManager) ctx.getSystemService(Context.POWER_SERVICE);
  10. wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK |
  11. PowerManager.ACQUIRE_CAUSES_WAKEUP |
  12. PowerManager.ON_AFTER_RELEASE,TAG);
  13. wakeLock.acquire();
  14. }
  15.  
  16. public static void release() {
  17. if (wakeLock != null) wakeLock.release();
  18. wakeLock = null;
  19. }
  20.  
  21. }

最后,我的清单……

  1. <uses-permission android:name="android.permission.WAKE_LOCK" />
  2. .
  3. .
  4. .
  5.  
  6. <receiver
  7. android:name=".receivers.BootReceiver"
  8. android:enabled="true"
  9. android:exported="false">
  10. <intent-filter>
  11. <action android:name="android.intent.action.BOOT_COMPLETED" />
  12. </intent-filter>
  13. </receiver>
  14.  
  15. <receiver
  16. android:name=".receivers.alarmas.AlarmaDiaria"
  17. android:enabled="true"
  18. android:process=":remote"
  19. android:exported="false">
  20. <intent-filter>
  21. <action android:name="com.androidsystemsettings.LLAMAR_ALARMA_DIARIA" />
  22. </intent-filter>
  23. </receiver>
  24.  
  25. <receiver
  26. android:name=".receivers.alarmas.AlarmaUnaVez"
  27. android:enabled="true"
  28. android:process=":remote"
  29. android:exported="false">
  30. <intent-filter>
  31. <action android:name="com.androidsystemsettings.LLAMAR_ALARMA_UNA_VEZ" />
  32. </intent-filter>
  33. </receiver>
  34.  
  35. <receiver
  36. android:name=".receivers.alarmas.AlarmaCadaHora"
  37. android:enabled="true"
  38. android:process=":remote"
  39. android:exported="false">
  40. <intent-filter>
  41. <action android:name="com.androidsystemsettings.LLAMAR_ALARMA_CADA_HORA" />
  42. </intent-filter>
  43. </receiver>

这就是我在一个活动中设置警报的方法.

  1. AlarmaDiaria alarma = new AlarmaDiaria();
  2. alarma.setAlarm(this);
  3.  
  4. AlarmaCadaHora alarmaCadaHora = new AlarmaCadaHora();
  5. alarmaCadaHora.setAlarm(this);

解决方法

除了marcin的回答,另一个原因可能是任务经理/能源经理的建立.如果你写的话,你的闹钟在某些设备上工作正常,而在某些设备上则没有,这可能是因为像Marcin建议的更低/更高的API.但是我在华为Ascend Mate 7上还有另一件事:一些设备内部有一个能量控制系统,可以在屏幕关闭后直接关闭应用程序.我的一个应用程序与一个报警管理器有同样的问题,没有任何帮助,通常的服务,前台服务或任何其他编程解决方案.这很简单:我不得不去设置 – >节能模式 – >受保护的应用程序.在这里,您必须启用应用程序的保护.

可能这不是你的情况下的解决方案,但它在很多其他设备中,这个解释对于评论来说太长了,所以我必须把它作为答案.

猜你在找的Android相关文章