Я создал запланированный повторный сигнал тревоги один раз в определенное время каждый день, используя 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 ().