Уведомление о напоминании не отображается - PullRequest
0 голосов
/ 06 мая 2018

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

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

Код для установки времени:

try {
        Date date = format.parse(timeInput);//This part works
        long time = date.getTime();//Get the time in milliseconds

        Intent i = new Intent(getBaseContext(), AlarmReceiver.class);

        PendingIntent alarmSender = PendingIntent.getBroadcast(getBaseContext(), 0, i, 0);

        AlarmManager am = (AlarmManager) getBaseContext().getSystemService(Context.ALARM_SERVICE);
        am.set(AlarmManager.RTC_WAKEUP, time, alarmSender);

        Toast.makeText(getBaseContext(), "Keep the app running to receive a reminder notification", Toast.LENGTH_LONG).show();

        super.onBackPressed();

    }catch(Exception e){
        Toast.makeText(getBaseContext(), "Parsing error. Format:\ndd/MM/yyyy and HH:mm", Toast.LENGTH_SHORT).show();
    }

Метод AlarmReceiver.onReceive():

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

    Intent i = new Intent(context, MenuActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, i, 0);


    NotificationCompat.Builder nBulder = new NotificationCompat.Builder(context)
            .setSmallIcon(R.drawable.notify_icon)
            .setContentTitle("title")
            .setContentText("text")
            .setPriority(NotificationCompat.PRIORITY_DEFAULT)
            .setContentIntent(pendingIntent)
            .setAutoCancel(true);
    NotificationManagerCompat nManager = NotificationManagerCompat.from(context);
    nManager.notify(0, nBulder.build());

}

Все правильно объявлено в файле манифеста.

Ответы [ 2 ]

0 голосов
/ 06 мая 2018
   <receiver
        android:name=".AlarmReceiver"
        android:enabled="true"
        android:exported="true"></receiver>

    public class AlarmReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            // TODO: This method is called when the BroadcastReceiver is receiving
            // an Intent broadcast.
           throw new UnsupportedOperationException("Not yet implemented");
       }
   }

Незначительные изменения:

    try {
        long time = System.currentTimeMillis();
        Intent i = new Intent(getApplicationContext(), AlarmReceiver.class);
        PendingIntent alarmSender = PendingIntent.getBroadcast(getApplicationContext(), 0, i, 0);
        AlarmManager am = (AlarmManager) getApplication().getSystemService(Context.ALARM_SERVICE);
        am.set(AlarmManager.RTC_WAKEUP, time, alarmSender);
    } catch(Exception e){
        Toast.makeText(getBaseContext(), "Parsing error. Format:\ndd/MM/yyyy and HH:mm", Toast.LENGTH_SHORT).show();
    }

Разница между getContext (), getApplicationContext (), getBaseContext () и "this"

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

Я нашел другой способ сделать это. Вместо использования BroadcastListener и AlarmManager я использую новый Thread. Он ожидает до System.currentTimeMillis() == time и запускает исполняемый файл в потоке пользовательского интерфейса, используя runOnUIThread(). В этом работающем, уведомление сделано.

Я не знаю, является ли это хорошим / эффективным решением, но оно отлично работает.

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