onHandleIntent 不触发位置更新
onHandleIntent not firing with location updates
我正在尝试使用 Play 服务位置 API 来收听位置变化。
我想做的是采用后台应用程序方法并使用 PendingIntent
获取更新。但是,根本不会调用 onHandleIntent() 函数。
我没有找到关于此方法的全面文档的单一来源。你能告诉我我做错了什么吗?
public class LocationCollector extends IntentService implements GoogleApiClient.ConnectionCallbacks
, GoogleApiClient.OnConnectionFailedListener {
private Context mContext;
private GoogleApiClient mLocationClient;
public LocationCollector(Context context){
super("LocationCollector");
mContext = context;
mLocationClient = new GoogleApiClient.Builder(mContext)
.addApi(LocationServices.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
}
public void start(){
mLocationClient.connect();
}
public void stop(){
mLocationClient.disconnect();
}
@Override
public void onConnected(Bundle bundle) {
LocationRequest request = LocationRequest.create()
.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
Intent locationIntent = new Intent(mContext, LocationCollector.class);
PendingIntent locationPendingIntent = PendingIntent.getService(mContext, 1, locationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
PendingResult<Status> result = LocationServices.FusedLocationApi.requestLocationUpdates(mLocationClient, request, locationPendingIntent);
}
@Override
public void onConnectionSuspended(int i) {
Log.d("Location","Api connection suspended");
}
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
Log.d("Location","Api connection failed");
}
@Override
protected void onHandleIntent(Intent intent) {
Location location = intent.getParcelableExtra(FusedLocationProviderApi.KEY_LOCATION_CHANGED);
if(location != null){
String time= intent.getStringExtra("time");
Toast.makeText(mContext,location.toString(),Toast.LENGTH_SHORT).show();
}
}
}
Can you tell me is there something I'm doing wrong?
首先,Service
是 Context
。你不需要——甚至不想——传递一些Context
给它。
其次,永远不要使用您的构造函数。将其替换为零参数构造函数。
第三,start()
和 stop()
不是 IntentService
上的生命周期方法,因此我不太确定您期望如何调用它们。再加上之前的问题,意味着这项服务不会发生任何事情。
说您希望 IntentService
通过 onHandleIntent()
方法来处理位置,这是合理的。但是,该服务之外的某些东西将需要进行连接和断开连接,否则您将需要一个复杂得多的服务。
我正在尝试使用 Play 服务位置 API 来收听位置变化。
我想做的是采用后台应用程序方法并使用 PendingIntent
获取更新。但是,根本不会调用 onHandleIntent() 函数。
我没有找到关于此方法的全面文档的单一来源。你能告诉我我做错了什么吗?
public class LocationCollector extends IntentService implements GoogleApiClient.ConnectionCallbacks
, GoogleApiClient.OnConnectionFailedListener {
private Context mContext;
private GoogleApiClient mLocationClient;
public LocationCollector(Context context){
super("LocationCollector");
mContext = context;
mLocationClient = new GoogleApiClient.Builder(mContext)
.addApi(LocationServices.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
}
public void start(){
mLocationClient.connect();
}
public void stop(){
mLocationClient.disconnect();
}
@Override
public void onConnected(Bundle bundle) {
LocationRequest request = LocationRequest.create()
.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
Intent locationIntent = new Intent(mContext, LocationCollector.class);
PendingIntent locationPendingIntent = PendingIntent.getService(mContext, 1, locationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
PendingResult<Status> result = LocationServices.FusedLocationApi.requestLocationUpdates(mLocationClient, request, locationPendingIntent);
}
@Override
public void onConnectionSuspended(int i) {
Log.d("Location","Api connection suspended");
}
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
Log.d("Location","Api connection failed");
}
@Override
protected void onHandleIntent(Intent intent) {
Location location = intent.getParcelableExtra(FusedLocationProviderApi.KEY_LOCATION_CHANGED);
if(location != null){
String time= intent.getStringExtra("time");
Toast.makeText(mContext,location.toString(),Toast.LENGTH_SHORT).show();
}
}
}
Can you tell me is there something I'm doing wrong?
首先,Service
是 Context
。你不需要——甚至不想——传递一些Context
给它。
其次,永远不要使用您的构造函数。将其替换为零参数构造函数。
第三,start()
和 stop()
不是 IntentService
上的生命周期方法,因此我不太确定您期望如何调用它们。再加上之前的问题,意味着这项服务不会发生任何事情。
说您希望 IntentService
通过 onHandleIntent()
方法来处理位置,这是合理的。但是,该服务之外的某些东西将需要进行连接和断开连接,否则您将需要一个复杂得多的服务。