C'est peut-être tard mais j'espère que cela aide quelqu'un.
J'ai été coincé sur le même problème pendant si longtemps. Mais maintenant je sais comment résoudre ce problème. C'est pour toute personne qui pourrait avoir le même problème. Les gens ne cessent de dire que vous devez activer AutoStart mais j'ai réussi à le faire sans utiliser le démarrage automatique.
Tout d'abord, WakeFullBroadcastaReceiver est désormais obsolète et vous devez utiliser BroadcastReceiver. Deuxièmement, vous devez utiliser ForegroudService au lieu de BackgroundService.
Je vais vous donner l'exemple ci-dessous:
IntentService.class
public class NotificationService extends IntentService {
public NotificationService() {
super("NotificationService");
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
super.onStartCommand(intent, flags, startId);
return START_NOT_STICKY;
}
@Override
protected void onHandleIntent(@Nullable Intent intent) {
startForegroundServiceT();
sendNotification(intent);
stopSelf();
}
private void startForegroundServiceT(){
if (Build.VERSION.SDK_INT >= 26) {
String CHANNEL_ID = "my_channel_01";
NotificationChannel channel = new NotificationChannel(CHANNEL_ID,
"Channel human readable title",
NotificationManager.IMPORTANCE_DEFAULT);
((NotificationManager)
getSystemService(Context.NOTIFICATION_SERVICE)).createNotificationChannel(channel);
Notification notification = new Notification.Builder(this, CHANNEL_ID)
.setContentTitle("")
.setContentText("").build();
startForeground(1, notification);
}
}
private void sendNotification(Intent intent){
}
}
démarrer le service de premier plan dans BroadcastReceiver.class
public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent service = new Intent(context, NotificationService.class);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
context.startForegroundService(service);
} else {
context.startService(service);
}
}
}
Et le setAlarms comme ceci:
public static void setAlarm(Context context, int requestCode, int hour, int minute){
AlarmManager alarmManager =( AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context
, AlarmReceiver.class);
intent.setAction("android.intent.action.NOTIFY");
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 1001, intent, 0);
Calendar time = getTime(hour, minute);
if (Build.VERSION.SDK_INT >= 23){
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP,time.getTimeInMillis(),pendingIntent);
}
else{
alarmManager.set(AlarmManager.RTC_WAKEUP,time.getTimeInMillis(),pendingIntent);
}
Ensuite, vous devez déclarer le récepteur et le service de premier plan dans le manifeste.
<receiver android:name=".AlarmReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.NOTIFY">
</action>
</intent-filter>
</receiver>
<service
android:name=".NotificationService"
android:enabled="true"
android:exported="true"></service>
J'espère que ça aidera quelqu'un.