Android前台服务在24小时后被终止是因为Android系统对于前台服务有一个时间限制,超过该时间限制后系统会自动终止前台服务。这个时间限制在Android 8.0(API level 26)及以上为5分钟,而在Android 7.1(API level 25)及以下为1小时。如果需要在超过这个时间后仍然保持前台服务运行,可以使用以下方法解决:
public class MyForegroundService extends Service {
private static final int NOTIFICATION_ID = 1;
private static final long ALARM_INTERVAL = 24 * 60 * 60 * 1000; // 24 hours
@Override
public void onCreate() {
super.onCreate();
startForeground(NOTIFICATION_ID, createNotification());
scheduleAlarm();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// Do your work here
return START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
cancelAlarm();
}
private Notification createNotification() {
// Create and return a notification for the foreground service
return new NotificationCompat.Builder(this, CHANNEL_ID)
// Set notification content
.build();
}
private void scheduleAlarm() {
// Schedule an alarm to start the service after the specified interval
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(this, MyForegroundService.class);
PendingIntent pendingIntent = PendingIntent.getService(this, 0, intent, 0);
long triggerAtMillis = System.currentTimeMillis() + ALARM_INTERVAL;
alarmManager.setExact(AlarmManager.RTC_WAKEUP, triggerAtMillis, pendingIntent);
}
private void cancelAlarm() {
// Cancel the scheduled alarm
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(this, MyForegroundService.class);
PendingIntent pendingIntent = PendingIntent.getService(this, 0, intent, 0);
alarmManager.cancel(pendingIntent);
}
}
public class MyForegroundService extends Service {
private static final int JOB_ID = 1;
private static final long JOB_INTERVAL = 24 * 60 * 60 * 1000; // 24 hours
@Override
public void onCreate() {
super.onCreate();
startForeground(NOTIFICATION_ID, createNotification());
scheduleJob();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// Do your work here
return START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
cancelJob();
}
private Notification createNotification() {
// Create and return a notification for the foreground service
return new NotificationCompat.Builder(this, CHANNEL_ID)
// Set notification content
.build();
}
private void scheduleJob() {
// Schedule a job to start the service after the specified interval
JobScheduler jobScheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
JobInfo.Builder builder = new JobInfo.Builder(JOB_ID, new ComponentName(this, MyJobService.class));
builder.setMinimumLatency(JOB_INTERVAL);
jobScheduler.schedule(builder.build());
}
private void cancelJob() {
// Cancel the scheduled job
JobScheduler jobScheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
jobScheduler.cancel(JOB_ID);
}
}
public class MyJobService extends JobService {
@Override
public boolean onStartJob(JobParameters params) {
// Start the foreground service here
MyForegroundService.start(this);
return false;
}