AlarmManager не срабатывает - PullRequest
0 голосов
/ 02 ноября 2018

мое приложение заметок должно помнить моих пользователей с уведомлением в их заметке в определенную дату и время, которое пользователь установил. Моя проблема в том, что я не получаю уведомления в установленное время.
Это мой alarmManager.class (здесь я создаю свои тревоги)

public class alarmManager {

    public static void createAlarm(long timeInMillis, int requestCode, Intent i) {
        PendingIntent pi = PendingIntent.getService(MainActivity.context, requestCode, i, PendingIntent.FLAG_UPDATE_CURRENT);
        getAlarmManager().set(AlarmManager.RTC_WAKEUP, timeInMillis, pi);
    }

    public static void deleteAlarm(Intent i, int requestCode) {
        if (doesPendingIntentExist(MainActivity.context, i, requestCode)) {
            PendingIntent pi = PendingIntent.getService(MainActivity.context, requestCode, i, PendingIntent.FLAG_NO_CREATE);
            pi.cancel();
            getAlarmManager().cancel(pi);
        }
    }

    private static AlarmManager getAlarmManager() {
        return (AlarmManager) MainActivity.context.getSystemService(Context.ALARM_SERVICE);
    }

    private static boolean doesPendingIntentExist(Context context, Intent i, int requestCode) {
        PendingIntent pi = PendingIntent.getService(context, requestCode, i, PendingIntent.FLAG_NO_CREATE);
        return pi != null;
    }
}  

Когда пользователь создает новую заметку, эти строки запускаются (они отправляют все, что нужно, в мой alarmManager.class)

Intent i = new Intent(MainActivity.context, NotificationService.class);
        i.putExtra(NotificationService.i_UID, id);
        i.putExtra(NotificationService.i_TEXT, title);
        i.putExtra(NotificationService.i_CONTENT, content);
        i.putExtra(NotificationService.i_REMINDEDATE, mUserReminderDate);
        i.putExtra(NotificationService.i_REPEAT, repeatAlarmSelectedOption);
        alarmManager.createAlarm(mUserReminderDate.getTime(), id.hashCode(), i);  

Когда все работает, NotificationService.class должен вызываться в выбранное время. (Здесь уведомление должно показываться пользователю)

public class NotificationService extends IntentService {
    public static final String i_UID = "uuid";
    public static final String i_TEXT = "title";
    public static final String i_CONTENT  = "content";
    public static final String i_REMINDEDATE = "remindeDate";
    public static final String i_REPEAT = "repeatAlarm";

    private String mTodoText, mTodoContent, mTodoUUID;
    private Date mTodoDate;
    private int mTodoRepeat;
    private Intent processIntent;

    public NotificationService() {
        super("NotificationService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        this.processIntent = intent;
        mTodoText = intent.getStringExtra(i_TEXT);
        mTodoContent = intent.getStringExtra(i_CONTENT);
        mTodoUUID = intent.getStringExtra(i_UID);
        mTodoDate = (Date) intent.getSerializableExtra(i_REMINDEDATE);
        mTodoRepeat = intent.getIntExtra(i_REPEAT, 0);

        NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        Notification notification = new Notification.Builder(this)
                .setContentTitle(mTodoText)
                .setContentText(mTodoContent)
                .setSmallIcon(R.drawable.app_logo_transparent_bg)
                .setAutoCancel(true)
                .setDefaults(Notification.DEFAULT_SOUND)
                .build();

        manager.notify(100, notification);
    }  

К сожалению, это не работает. Нет ошибок Нет уведомления Ничего.
Я надеюсь, что кто-то может мне помочь.

1 Ответ

0 голосов
/ 02 ноября 2018

На мой взгляд проблема в том, что при создании PendingIntent:

PendingIntent pi = PendingIntent.getService(MainActivity.context, requestCode, i, PendingIntent.FLAG_UPDATE_CURRENT);

Чтобы быть абсолютно уверенным, запланируйте тревогу, затем запустите с adb следующую команду: adb shell dumpsys alarm и найдите ваш PendingIntent. Если вы найдете его, запланируйте еще один сигнал тревоги и еще раз введите команду. Посмотрите еще раз на ваше ожидающее намерение и убедитесь, что оно новое, и попробуйте найти это предыдущее запланированное. Если это проблема с PendingIntent, вы найдете только самые новые PendingIntent.

Исправление:
Поскольку AlarmManger при сравнении PendingIntents не сравнивает переданные дополнительные данные, а сравнивает код запроса, данные, действие и категории, вам нужно менять один из них каждый раз, когда вы планируете новый сигнал тревоги. Я предлагаю передавать uri из базы данных в каждый новый запланированный PendingIntent. Это сделает каждый из них уникальным, так что старый не будет отменен, когда новый запланировано. Подводя итог, к аргументу i в вашем коде вызовите метод setData() и передайте uri в качестве аргумента. Вы можете сделать это в методе или в классе, где вызывается метод. Это может выглядеть так:

 public static void createAlarm(long timeInMillis, int requestCode, Intent i, Uri uri) {
       i.setData(uri)
        PendingIntent pi = PendingIntent.getService(MainActivity.context, requestCode, i, PendingIntent.FLAG_UPDATE_CURRENT);
        getAlarmManager().set(AlarmManager.RTC_WAKEUP, timeInMillis, pi);
    }
...