Điều này có thể là muộn nhưng tôi hy vọng nó sẽ giúp ai đó.
Tôi đã bị mắc kẹt về cùng một vấn đề quá lâu. Nhưng bây giờ tôi biết làm thế nào để giải quyết vấn đề này. Điều này dành cho bất kỳ ai có thể có cùng một vấn đề. Mọi người tiếp tục nói rằng bạn phải bật Tự động khởi động nhưng tôi đã cố gắng thành công bằng cách sử dụng tự động khởi động.
Trước hết, WakeFullBroadcastaReceiver hiện không được dùng nữa và bạn nên sử dụng BroadcastReceiver. Trước hết, bạn phải sử dụng ForegroudService thay vì BackgroundService.
Tôi sẽ cung cấp cho bạn ví dụ sau:
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){
}
}
khởi động dịch vụ nền trước trong 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);
}
}
}
Và setAlarms như thế này:
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);
}
Sau đó, bạn phải khai báo receiver và foregroundservice trong tệp kê khai.
<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>
Tôi hi vọng điêu nay se giup được ai đo.