我有一个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)
你回来START_NOT_STICKY了onStartCommand().
因此,每当操作系统杀死你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().
| 归档时间: |
|
| 查看次数: |
1678 次 |
| 最近记录: |