2016-02-25 3 views
0

Аварийный менеджер в моем приложении не работает. Я делаю все, как описано здесь https://developer.android.com/training/scheduling/alarms.html , но будильник не работает.
Вот мой код:Alarm Manager не работает

манифеста

<uses-permission android:name="com.android.alarm.permission.SET_ALARM"/> 

Ресивер (Ресивер зарегистрирован в манифесте)

@Override 
public void onReceive(Context context, Intent intent) { 

    Intent alarmIntent = new Intent(Constants.ALARM_INTENT); 
    alarmIntent.setClass(context, NotificationActivity.class); 
    alarmIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    context.startActivity(alarmIntent); 
} 

активность

AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
Intent intent = new Intent(context, AlarmReceiver.class); 
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0); 

Calendar calendar = Calendar.getInstance(); 
calendar.setTimeInMillis(System.currentTimeMillis()); 
calendar.set(Calendar.HOUR_OF_DAY, 1); 
calendar.set(Calendar.MINUTE, 30); 

alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, 
     calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent); 

Я не знаю, как заставить его работать. Пожалуйста, помогите мне исправить это.

ответ

0

Во-первых, удалите SET_ALARM разрешение, так как оно здесь не имеет отношения.

Во-вторых, вы должны убедиться, что ваш объект Calendar в будущем. В большинстве случаев ваш будет в прошлом, потому что вы используете calendar.set(Calendar.HOUR_OF_DAY, 1) и set(Calendar.MINUTE, 30). Если вы выполните этот код после 01:30, это будет в прошлом. В таком случае вам нужно будет add() один день, чтобы завтра было в 01:30.

В-третьих, используйте adb shell dumpsys alarm, чтобы узнать, запланирован ли ваш будильник, как только вы сделаете вышеуказанные исправления.

В-четвертых, используйте LogCat, чтобы узнать, есть ли какие-либо предупреждения или ошибки, возникающие из вашего кода, например, AlarmReceiver или NotificationActivity, которые не регистрируются в манифесте.

+0

@ Jackky777: 'adb' - это программа в Android SDK, предназначенная для запуска в командной строке. – CommonsWare

0

Вы просите тревоги на основе истекших часов реального времени системы здесь:

alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, 
     calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent); 

Но вы передаете это время на основе нормального календаря часов. Если вы хотите, тревога произойдет с помощью календаря на основе часов, скажем, вместо этого:

alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, 
     calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent); 

Обратите внимание на differnce в javadoc между ELAPSED_REALTIME_WAKEUP и RTC_WAKEUP.

+0

Это правильный ответ. – someUser