如何防止服务被破坏

Mat*_*lho 3 android

我有一个Service跟踪用户的位置,在我得到用户的位置的时候GoogleApiClient.

它发生了一些Service停止,依赖互联网或模型电话Service停止向webservice发送位置.好像被摧毁了.

我怎么能阻止这个?

public class LocationService extends Service implements
        GoogleApiClient.ConnectionCallbacks,
        GoogleApiClient.OnConnectionFailedListener,
        LocationListener {

    private static final String TAG = "LocationService";
    public long UPDATE_MILLISECONDS_DEFAULT = 180000;

    private boolean currentlyProcessingLocation = false;
    private LocationRequest locationRequest;
    private GoogleApiClient googleApiClient;

    @Override
    public void onCreate() {
        Log.d(TAG,"Location service create");
        super.onCreate();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // if we are currently trying to get a location and the alarm manager has called this again,
        // no need to start processing a new location.
        if (!currentlyProcessingLocation) {
            currentlyProcessingLocation = true;
            startTracking();
        }

        return START_NOT_STICKY;
    }

    private void startTracking() {
        Log.d(TAG, "startTracking");

        if (GooglePlayServicesUtil.isGooglePlayServicesAvailable(this) == ConnectionResult.SUCCESS) {
            googleApiClient = new GoogleApiClient.Builder(this)
                    .addApi(LocationServices.API)
                    .addConnectionCallbacks(this)
                    .addOnConnectionFailedListener(this)
                    .build();

            if (!googleApiClient.isConnected() || !googleApiClient.isConnecting()) {
                googleApiClient.connect();
            }
        } else {
            Log.e(TAG, "unable to connect to google play services.");
        }
    }

    protected void sendLocationToServer(Location location) {
            // here I call my webservice and send location
            Log.d(TAG, "Update to Server location");
    }

    @Override
    public void onDestroy() {
        Log.d(TAG,"Destroy service");
        stopLocationUpdates();
        super.onDestroy();

    }


    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onLocationChanged(Location location) {
       sendLocationToServer(location);
    }

    public void stopLocationUpdates() {
        if (googleApiClient != null && googleApiClient.isConnected()) {
            googleApiClient.disconnect();
        }
    }

    /**
     * Called by Location Services when the request to connect the
     * client finishes successfully. At this point, you can
     * request the current location or start periodic updates
     */
    @Override
    public void onConnected(Bundle bundle) {
        Log.d(TAG, "onConnected");

        locationRequest = LocationRequest.create();
            locationRequest.setInterval(UPDATE_MILLISECONDS_DEFAULT); // milliseconds for default
            locationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);


        //locationRequest.setFastestInterval(1000); // the fastest rate in milliseconds at which your app can handle location updates

        LocationServices.FusedLocationApi.requestLocationUpdates(
                googleApiClient, locationRequest, this);
    }

    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) {
        Log.e(TAG, "onConnectionFailed");

        stopLocationUpdates();
        stopSelf();
    }

    @Override
    public void onConnectionSuspended(int i) {
        Log.e(TAG, "GoogleApiClient connection has been suspend");
    }


}
Run Code Online (Sandbox Code Playgroud)

ear*_*jim 5

你回来START_NOT_STICKYonStartCommand().

因此,每当操作系统杀死你Service(例如回收内存)时,它就不会被重新创建.

更改以下行:

return START_NOT_STICKY;
Run Code Online (Sandbox Code Playgroud)

对此:

return START_STICKY;
Run Code Online (Sandbox Code Playgroud)

文件START_STICKY:

返回的常量onStartCommand(Intent, int, int):如果此服务的进程在启动时被终止(在返回之后 onStartCommand(Intent, int, int)),则将其保留在启动状态但不保留此传递的意图.稍后系统将尝试重新创建服务.因为它处于启动状态,所以它将保证onStartCommand(Intent, int, int)在创建新服务实例后调用; 如果没有任何挂起的启动命令要传递给服务,它将使用null intent对象调用,因此您必须注意检查这一点.

注意: START_STICKY不会阻止您Service被杀死.它只是告诉操作系统尽快重启(取决于可用的资源).为了减少你Service被杀的可能性,你可以通过调用让它在前台运行startForeground().