AlarmManager не вызывает BroadcastReceiver - PullRequest
0 голосов
/ 09 мая 2019

Я создал запланированный повторный сигнал тревоги один раз в определенное время каждый день, используя AlarmManager для запуска уведомления в классе, который расширяет BroadcastReceiver. Но метод onReceive никогда не вызывается из действия, в котором был установлен AlarmManager.

Я использую Android Oreo для тестирования приложений, поэтому я создал метод createNotificationChannel () для установки NotificationChannel и вызова его из моего метода MainActivity onCreate ().

public void createNotificationChannel() {
    mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

    if (android.os.Build.VERSION.SDK_INT >=
            android.os.Build.VERSION_CODES.O) {

        // Create the NotificationChannel with all the parameters.
        NotificationChannel notificationChannel = new NotificationChannel
                (PRIMARY_CHANNEL_ID,
                        "My Notification",
                        NotificationManager.IMPORTANCE_HIGH);

        notificationChannel.enableLights(true);
        notificationChannel.setLightColor(Color.RED);
        notificationChannel.enableVibration(true);
        notificationChannel.setDescription
                ("My Notification Description");
        mNotificationManager.createNotificationChannel(notificationChannel);
    }
}

с некоторыми переменными:

private NotificationManager mNotificationManager;
private static final int NOTIFICATION_ID = 0;
private static final String PRIMARY_CHANNEL_ID = 
"primary_notification_channel";

Затем я настраиваю кнопку, чтобы метод onClick () вызывал метод startAlarm () следующим образом:

public void startAlarm(int aHour, int aMinutes) {
    mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

    Intent notifyIntent = new Intent(getApplicationContext(), AlarmReceiver.class);
    PendingIntent notifyPendingIntent = PendingIntent.getBroadcast
            (this, NOTIFICATION_ID, notifyIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);

    Calendar calendar= Calendar.getInstance();
    calendar.set(Calendar.HOUR_OF_DAY,aHour);
    calendar.set(Calendar.MINUTE, aMinutes);

    alarmManager.setInexactRepeating
            (AlarmManager.ELAPSED_REALTIME_WAKEUP,
                    calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, notifyPendingIntent);
}

И, наконец, в классе AlarmReceiver.java в onReceive () следующим образом:

public void onReceive(Context context, Intent intent) {
    mNotificationManager = (NotificationManager)
            context.getSystemService(Context.NOTIFICATION_SERVICE);
    callNotification(context);
}


private void callNotification(Context context) {
    Intent contentIntent = new Intent(context, DRSetting.class);
    PendingIntent contentPendingIntent = PendingIntent.getActivity
            (context, NOTIFICATION_ID, contentIntent, PendingIntent.FLAG_UPDATE_CURRENT);

    NotificationCompat.Builder builder = new NotificationCompat.Builder(context, PRIMARY_CHANNEL_ID);
    builder.setAutoCancel(true)
            .setDefaults(Notification.DEFAULT_ALL)
            .setWhen(System.currentTimeMillis())
            .setSmallIcon(R.drawable.icon_mynotif)
            .setContentTitle("My Title")
            .setContentIntent(contentPendingIntent)
            .setContentText("Reminder for you!")
            .setDefaults(Notification.DEFAULT_LIGHTS | Notification.DEFAULT_SOUND)
            .setContentInfo("Info");

    mNotificationManager.notify(NOTIFICATION_ID, builder.build());
}

в AndroidManifest.xml, я положил это:

    <receiver
        android:name=".AlarmReceiver"
        android:enabled="true"
        android:exported="false">
        <intent-filter>
            <action android:name="android.intent.action.NOTIFY" />
        </intent-filter>
    </receiver>

и разрешение следующим образом:

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

Итак, кто-нибудь может помочь мне, так как я не могу найти проблему, почему метод onReceive () никогда не вызывается, и, следовательно, нет никакого уведомления, которое когда-либо срабатывало в callNotification ().

1 Ответ

0 голосов
/ 18 мая 2019

Я обнаружил, что проблема, из-за которой сигнал тревоги не сработал, благодаря JournalDev. Это потому, что начиная с Android Oreo, неявные приемники вещания не будут работать при регистрации в AndroidManifest.xml. Вместо этого мы должны использовать явные широковещательные приемники. Поэтому я переделываю код, добавив два дополнительных метода следующим образом:

@Override
protected void onResume() {
    super.onResume();

    IntentFilter filter = new IntentFilter();
    filter.addAction("android.app.action.NEXT_ALARM_CLOCK_CHANGED");
    registerReceiver(alarmReceiver, filter);

    NotificationManager notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
    notificationManager.cancel(NOTIFICATION_ID);
}

@Override
protected void onStop() {
    super.onStop();
    unregisterReceiver(alarmReceiver);
}

Кроме того, мы должны обратить внимание на настройку значения календарного месяца, если мы хотим установить конкретную дату, чтобы вызвать тревогу. Месяц в Java начинается с 0 до 11, поэтому нам нужно -1 при преобразовании значения месяца из DatePicker. Я надеюсь, что этот ответ может помочь другим, сталкивающимся с той же проблемой.

...