Android Alarm Manager не срабатывает, пытается отправить уведомление - PullRequest
0 голосов
/ 14 мая 2018

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

Я устанавливаю будильник на 1 минуту в будущем, но мой приемник вещания никогда не вызывается.

Вот как я планирую AlarmManager и строю Notification:

private void scheduleNotification(Date notificationdate) {
    Log.d("PSBMF", "scheduling notification at "+notificationdate);

    Intent intent = new Intent(Intent.ACTION_DIAL);
    intent.setData(Uri.parse("tel:"+AppController.statewidephone));
    PendingIntent pendingIntent = PendingIntent.getActivity(getActivity(), 0, intent, 0);

    String notificationmessage = "Test Message";
    String channelid = "Channel Id";
    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(getActivity(), channelid)
            .setSmallIcon(R.drawable.ic_warning_black_36dp)
            .setContentTitle("Notification Title")
            .setContentText("Notification Content")
            .setStyle(new NotificationCompat.BigTextStyle().bigText("Notification Content"))
            .setPriority(NotificationCompat.PRIORITY_MAX)
            .setContentIntent(pendingIntent)
            .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
            .setDefaults(Notification.DEFAULT_ALL)
            ;

    Notification notification = mBuilder.build();

    Intent notificationIntent = new Intent(mActivity, NotificationPublisher.class);
    notificationIntent.putExtra(NotificationPublisher.NOTIFICATION_ID, 1);
    notificationIntent.putExtra(NotificationPublisher.NOTIFICATION, notification);
    PendingIntent pendingAlarmIntent = PendingIntent.getBroadcast(mActivity, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);

    long notificationTimeInMillis = notificationdate.getTime();
    AlarmManager alarmManager = (AlarmManager)mActivity.getSystemService(Context.ALARM_SERVICE);
    alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, notificationTimeInMillis, pendingAlarmIntent);

}

Мой NotificationPublisher.class выглядит так:

public class NotificationPublisher extends BroadcastReceiver {

    public static String NOTIFICATION_ID = "notification-id";
    public static String NOTIFICATION = "notification";

    public void onReceive(Context context, Intent intent) {

        Log.d("NP", "NOTIFICATION RECEIVED: "+context);

        NotificationManager notificationManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);

        Notification notification = intent.getParcelableExtra(NOTIFICATION);
        int id = intent.getIntExtra(NOTIFICATION_ID, 0);
        notificationManager.notify(id, notification);

    }
}

и я зарегистрировал свой NotificationPublisher/BroadcastReceiver, поместив его в тег <application/> моего манифеста:

<receiver android:name=".NotificationPublisher"/>

Что еще мне не хватает? Почему мой Тревога не сработает и не вызовет метод onReceive?

Ответы [ 3 ]

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

попробуйте зарегистрировать вашу трансляцию динамически

NotificationPublisher myBroadcastReceiver = new NotificationPublisher();// Register the broadcast
registerReceiver(myBroadcastReceiver, intentFilter);

И измените это alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,notificationTimeInMillis, pendingAlarmIntent); на

alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,notificationTimeInMillis, pendingAlarmIntent);
0 голосов
/ 15 мая 2018

Почувствуйте связь, это связано с изменениями широковещательных приемников .

Регистрация получателей в манифесте больше не будет работать на основании:

Примечание. Если ваше приложение предназначено для уровня API 26 или выше, вы не можете использовать манифест для объявления получателя для неявных широковещательных рассылок (широковещательных рассылок, которые не ориентированы конкретно на ваше приложение), за исключением нескольких неявных широковещательных рассылок, которые освобождены от этого ограничения. , В большинстве случаев вместо этого вы можете использовать запланированные задания.

Примечание выше было скопировано с ссылки .

Надеюсь, это поможет.

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

Кажется, я понял свою проблему:

alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, notificationTimeInMillis, pendingAlarmIntent);

должно быть

alarmManager.set(AlarmManager.RTC_WAKEUP, notificationTimeInMillis, pendingAlarmIntent);
...