Реализация Snooze в уведомлениях Android - PullRequest
5 голосов
/ 21 апреля 2011

Какой лучший способ реализовать функцию повтора в уведомлении Android. (т. е. я уведомляю пользователя X [для аргументов ради, давайте воспользуемся примером текстового сообщения], и он пока не хочет беспокоиться об этом, но в то же время он хочет убедиться, что он не забывает Поэтому он хочет, чтобы он снова воспроизвел шум, но, например, через 5 минут)

Я видел, как это делает будильник Android, но мне кажется грязным (и, как правило, не очень хорошим) всплывающее намерение, когда пользователь может делать что-то важное.

С другой стороны, кажется невозможным поместить кнопки в область уведомлений. Или я не прав?

Что бы вы предложили?

Ответы [ 3 ]

7 голосов
/ 19 февраля 2012
  1. Добавить кнопку повтора:

    Button snooze = (Button) findViewById(R.id.snooze);
        snooze.setOnTouchListener(new OnTouchListener() {
            public boolean onTouch(View arg0, MotionEvent arg1) {
                 mMediaPlayer.stop();
                 finish();
                 return true;
            }
    };  
    
  2. Затем перед тем, как позвонить в будильник, обновите время

    Intent intent = new Intent(this, this.getClass());
    PendingIntent pendingIntent =
        PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    
    long currentTimeMillis = System.currentTimeMillis();
    long nextUpdateTimeMillis = currentTimeMillis + 5 * DateUtils.MINUTE_IN_MILLIS;
    Time nextUpdateTime = new Time();
    nextUpdateTime.set(nextUpdateTimeMillis);
    
    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    alarmManager.set(AlarmManager.RTC, nextUpdateTimeMillis, pendingIntent);
    
  3. Вызов будильника

5 голосов
/ 21 апреля 2011

Простая стратегия может быть следующей:

  • Текст уведомления может быть «1 новое сообщение. Нажмите здесь, чтобы повторить уведомление через 5 минут».
  • Если пользователь очищает уведомления, ничего не происходит, и уведомление очищается.
  • Если пользователь нажимает на уведомление, затем очистите уведомление, установите таймер и опубликуйте новое уведомление через 5 минут.

В качестве альтернативы, щелкнув по уведомлению, можно вывести активность на передний план, которая установит таймер, если от пользователя не будет другого ввода (например, нажатие кнопки «отклонить»).

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

Лучшая стратегия будет зависеть от того, что делает приложение, и какой уровень настройки пользователь может выполнить. Я не стал бы реализовывать любое поведение snozze, которое не может быть легко предотвращено пользователем (может быть очень раздражающим, если нет).

0 голосов
/ 22 мая 2018

Я сделал это точно так же, как я создал первое тревожное уведомление

  private void startAlarm(Calendar calendar) {

    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

    Intent intent = new Intent(this, AlertReceiver.class);

    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, Config.NOTIFICATION_REQUEST_CODE, intent, 0);

    //Repeat every 24 hours
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 24*60*60*1000, pendingIntent);
}

Так что для снятия уведомления или тревоги я просто создал другую тревогу, но это не повторение тревоги. это сработает только один раз

    private void snoozeAlarm() {

    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

    Intent intent = new Intent(this, AlertReceiver.class);

    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, Config.NOTIFICATION_REQUEST_CODE, intent, 0);

    alarmManager.setExact(AlarmManager.RTC_WAKEUP,
            Calendar.getInstance().getTimeInMillis() + 5 * 60000, //...start alarm again after 5 minutes
            pendingIntent);

    finish();
    System.exit(0); //...exit the activity which displayed
}

если кому-то нужно взглянуть на AlertReceiver.class

 public class AlertReceiver extends BroadcastReceiver {

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


        intent = new Intent();
        intent.setClass(context, DisplayedOnScreen.class); 
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intent);

        NotificationHelper notificationHelper = new NotificationHelper(context);
        NotificationCompat.Builder notificationBuilder = notificationHelper.getNotification();
        notificationHelper.getManager().notify(1, notificationBuilder.build());

    }
}
...