前台服务在一段时间后被 Android 杀死
Foreground service is being killed by Android after some time
对于位置更新,我使用了 Fused Location API,但似乎某些 Android 手机在一段时间后正在终止前台服务。我如何 运行 前台服务并确保它们不会被 Android?
终止
public class LocationUpdatesService extends Service {
public class LocalBinder extends Binder {
public LocationUpdatesService getService() {
return LocationUpdatesService.this;
}
}
private final IBinder mBinder = new LocalBinder();
@Override
public void onCreate() {
createFusedLocationClient();
createFusedLocationRequest();
createLocationCallback();
startForeground(NOTIFICATION_ID, createNotification());
}
private void createFusedLocationClient() {
locationClient = LocationServices.getFusedLocationProviderClient(getApplicationContext());
}
private void createFusedLocationRequest() {
locationRequest = new LocationRequest();
locationRequest.setMaxWaitTime(MAXIMUM_WAIT_TIME);
locationRequest.setSmallestDisplacement(MAXIMUM_DISPLACEMENT);
locationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
String action = intent.getAction();
if (action != null && action.equalsIgnoreCase(Constants.REQUEST_LOCATION_UPDATES)) {
requestLocationUpdates();
}
if (action != null && action.equalsIgnoreCase(Constants.REMOVE_LOCATION_UPDATES)) {
removeLocationUpdates();
stopSelf();
}
return START_REDELIVER_INTENT;
}
@Override
public IBinder onBind(Intent intent) {
ContextCompat.startForegroundService(getApplicationContext(), new Intent(getApplicationContext(),
LocationUpdatesService.class));
return mBinder;
}
}
您可以在函数onTaskRemoved中重启服务
override fun onTaskRemoved(rootIntent: Intent) {
val restartServiceIntent = Intent(applicationContext, LocationUpdatesService::class.java).also {
it.setPackage(packageName)
};
val restartServicePendingIntent: PendingIntent = PendingIntent.getService(this, 1, restartServiceIntent, PendingIntent.FLAG_ONE_SHOT);
applicationContext.getSystemService(Context.ALARM_SERVICE);
val alarmService: AlarmManager = applicationContext.getSystemService(Context.ALARM_SERVICE) as AlarmManager;
alarmService.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() + 1000, restartServicePendingIntent);
}
如果有人遇到同样的问题,这篇文章对我帮助很大,它描述了如何创建前台服务
https://robertohuertas.com/2019/06/29/android_foreground_services/
对于位置更新,我使用了 Fused Location API,但似乎某些 Android 手机在一段时间后正在终止前台服务。我如何 运行 前台服务并确保它们不会被 Android?
终止public class LocationUpdatesService extends Service {
public class LocalBinder extends Binder {
public LocationUpdatesService getService() {
return LocationUpdatesService.this;
}
}
private final IBinder mBinder = new LocalBinder();
@Override
public void onCreate() {
createFusedLocationClient();
createFusedLocationRequest();
createLocationCallback();
startForeground(NOTIFICATION_ID, createNotification());
}
private void createFusedLocationClient() {
locationClient = LocationServices.getFusedLocationProviderClient(getApplicationContext());
}
private void createFusedLocationRequest() {
locationRequest = new LocationRequest();
locationRequest.setMaxWaitTime(MAXIMUM_WAIT_TIME);
locationRequest.setSmallestDisplacement(MAXIMUM_DISPLACEMENT);
locationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
String action = intent.getAction();
if (action != null && action.equalsIgnoreCase(Constants.REQUEST_LOCATION_UPDATES)) {
requestLocationUpdates();
}
if (action != null && action.equalsIgnoreCase(Constants.REMOVE_LOCATION_UPDATES)) {
removeLocationUpdates();
stopSelf();
}
return START_REDELIVER_INTENT;
}
@Override
public IBinder onBind(Intent intent) {
ContextCompat.startForegroundService(getApplicationContext(), new Intent(getApplicationContext(),
LocationUpdatesService.class));
return mBinder;
}
}
您可以在函数onTaskRemoved中重启服务
override fun onTaskRemoved(rootIntent: Intent) {
val restartServiceIntent = Intent(applicationContext, LocationUpdatesService::class.java).also {
it.setPackage(packageName)
};
val restartServicePendingIntent: PendingIntent = PendingIntent.getService(this, 1, restartServiceIntent, PendingIntent.FLAG_ONE_SHOT);
applicationContext.getSystemService(Context.ALARM_SERVICE);
val alarmService: AlarmManager = applicationContext.getSystemService(Context.ALARM_SERVICE) as AlarmManager;
alarmService.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() + 1000, restartServicePendingIntent);
}
如果有人遇到同样的问题,这篇文章对我帮助很大,它描述了如何创建前台服务
https://robertohuertas.com/2019/06/29/android_foreground_services/