2014-10-25 2 views
2

Я реализовал диспетчер аварийных сообщений так же, как и в примере приложения Google. Все работает корректно, за исключением случаев, когда я перезапускаю приложение, диспетчер аварийных сигналов больше не останавливается.AlarmManager не останавливается после перезапуска приложения.

AlarmReceiver.class

public class AlarmReceiver extends WakefulBroadcastReceiver { 

AlarmManager alarmManager; 
PendingIntent alarmIntent; 


@Override 
public void onReceive(Context context, Intent intent) { 
    // do stuff here 
} 

public void setAlarm(Context context) 
{ 
    alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
    alarmIntent = PendingIntent.getBroadcast(context, 0, new Intent(context, AlarmReceiver.class), 0); 

    // Fire alarm every 30min 
    alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME, 
      5000, 
      5000, 
      alarmIntent); 

    // Restart alarm if device is rebooted 
    ComponentName receiver = new ComponentName(context, BootReceiver.class); 
    PackageManager pm = context.getPackageManager(); 
    pm.setComponentEnabledSetting(receiver, 
      PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 
      PackageManager.DONT_KILL_APP); 
} 

public void cancelAlarm(Context context) 
{ 
    if (alarmManager != null) 
    { 
     alarmManager.cancel(alarmIntent); 
    } 

    // Disable BootReceiver so that alarm won't start again if device is rebooted 
    ComponentName receiver = new ComponentName(context, BootReceiver.class); 
    PackageManager pm = context.getPackageManager(); 
    pm.setComponentEnabledSetting(receiver, 
      PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 
      PackageManager.DONT_KILL_APP); 
    } 
} 

Так вот проблема. Когда я впервые запускаю приложение и запускаю AlarmManager, я могу легко его остановить. Но как только я закрою приложение и запустил его снова, AlarmManager больше не может быть остановлен. Ничего не происходит, когда я нажимаю кнопку остановки вообще.

Я почти на 100% уверен, что причина в том, что AlarmManager имеет значение null после перезапуска приложения. Но если я удалю оператор if, приложение выйдет из строя.

Но почему же это якобы работает в образце приложения, но не в моем приложении?

+0

У меня была такая же проблема, моя тревога не перезапускается после перезагрузки телефона. Я поставил будильник в течение 2 минут, если между устройством времени перезагрузка будильника не срабатывает. У меня было более 30 различных сигналов тревоги в разных фрагментах, поэтому, пожалуйста, помогите мне. –

ответ

2

Я Solver мою проблему путем изменения метода cancelAlarm так:

public void cancelAlarm(Context context) 
{ 
    alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
    alarmIntent = PendingIntent.getBroadcast(context, 0, new Intent(context, AlarmReceiver.class), 0); 
    alarmManager.cancel(alarmIntent); 

    // Disable BootReceiver so that alarm won't start again if device is rebooted 
    ComponentName receiver = new ComponentName(context, BootReceiver.class); 
    PackageManager pm = context.getPackageManager(); 
    pm.setComponentEnabledSetting(receiver, 
      PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 
      PackageManager.DONT_KILL_APP); 
} 
0

Ничего не происходит при нажатии на кнопку остановки на всех.

В вашем запросе нет кнопки «Stop».

Я почти на 100% уверен, что причина в том, что AlarmManager является недействительным после перезагрузки приложения

Я понятия не имею, что «перезагрузка приложение» означает.

Но вы используете WakefulBroadcastReceiver. Данные о зарегистрированном манифестах BroadcastReceiver являются серьезным запахом кода. Экземпляр такого BroadcastReceiver будет жить для одного звонка до onReceive(). Следующая трансляция создаст новый экземпляр и так далее. Следовательно, эти члены данных будут бесполезны после завершения onReceive().

Поэтому я настоятельно рекомендую вам удалить:

AlarmManager alarmManager; 
PendingIntent alarmIntent; 

и что должно прояснить вашу проблему AlarmManager -is- null.