一段时间后,前台服务被Android杀死

Posted

技术标签:

【中文标题】一段时间后,前台服务被Android杀死【英文标题】:Foreground service is being killed by Android after some time 【发布时间】:2021-07-02 00:42:15 【问题描述】:

对于更新的位置,我使用了 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;



【问题讨论】:

非正统方式是onDestroy重新启动服务。 如果您找到解决方案,请创建一个描述它的答案,您还可以链接到有用的网络内容。 【参考方案1】:

可以在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/

【讨论】:

以上是关于一段时间后,前台服务被Android杀死的主要内容,如果未能解决你的问题,请参考以下文章

android前台服务以及通知

与前台服务android通信

与前台服务android通信

Android 前台服务

前台服务在执行互联网相关操作时被杀死

Android,前台服务让app保持活力吗?