如何将位置更新直接发送到Intent Service?以下方法不起作用。调用OnConnected函数,但从未在服务中接收到intent:
...
private PendingIntent getLocationPendingIntent(boolean shouldCreate) {
Intent broadcast = new Intent(m_context,LocationUpdateService.class);
int flags = shouldCreate ? 0 : PendingIntent.FLAG_NO_CREATE;
return PendingIntent.getService(m_context, 0, broadcast, flags);
}
@Override
public void onConnected(Bundle arg0) {
PendingIntent locationPendingIntent = getLocationPendingIntent(true);
LocationRequest locationRequest = new LocationRequest();
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
locationRequest.setInterval(LOCATION_UPDATE_INTERVAL);
locationRequest.setFastestInterval(LOCATION_FASTEST_UPDATE_INTERVAL);
LocationServices.FusedLocationApi.requestLocationUpdates(m_googleApiClient, locationRequest,locationPendingIntent);
}
...
意图服务:
import android.app.IntentService;
import android.content.Intent;
import android.util.Log;
public class LocationUpdateService extends IntentService {
public LocationUpdateService() {
super(LocationUpdateService.class.getName());
}
@Override
public int onStartCommand(Intent intent, int flags, int startID) {
super.onStartCommand(intent, flags, startID);
Log.d("LocationUpdateService","Location received");
return START_REDELIVER_INTENT;
}
@Override
protected void onHandleIntent(Intent intent) {
Log.d("LocationUpdateService","Intent received");
}
}
清单文件:
...
<service android:name=".LocationUpdateService" />
...
答案 0 :(得分:20)
以下是经过验证的代码,它根据找到的代码here成功地将IntentService设置为用于位置更新的PendingIntent中包含的Intent的接收器。
首先,IntentService
:
import android.app.IntentService;
import android.content.Intent;
import android.location.Location;
import android.util.Log;
import com.google.android.gms.location.FusedLocationProviderApi;
import com.google.android.gms.location.LocationResult;
public class LocationUpdateService extends IntentService {
private final String TAG = "LocationUpdateService";
Location location;
public LocationUpdateService() {
super("LocationUpdateService");
}
@Override
protected void onHandleIntent(Intent intent) {
if (LocationResult.hasResult(intent)) {
LocationResult locationResult = LocationResult.extractResult(intent);
Location location = locationResult.getLastLocation();
if (location != null) {
Log.d("locationtesting", "accuracy: " + location.getAccuracy() + " lat: " + location.getLatitude() + " lon: " + location.getLongitude());
}
}
}
}
以下是使用PendingIntent
注册位置更新的活动代码,该代码发送到IntentService
:
import android.app.PendingIntent;
import android.os.Bundle;
import android.content.Intent;
import android.app.Activity;
import android.widget.Toast;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
public class MainActivity extends Activity implements
GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {
LocationRequest mLocationRequest;
GoogleApiClient mGoogleApiClient;
PendingIntent mRequestLocationUpdatesPendingIntent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
buildGoogleApiClient();
mGoogleApiClient.connect();
}
@Override
protected void onPause(){
super.onPause();
if (mGoogleApiClient != null) {
LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, mRequestLocationUpdatesPendingIntent);
}
}
protected synchronized void buildGoogleApiClient() {
Toast.makeText(this,"buildGoogleApiClient",Toast.LENGTH_SHORT).show();
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
}
@Override
public void onConnected(Bundle bundle) {
Toast.makeText(this,"onConnected",Toast.LENGTH_SHORT).show();
mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(10);
mLocationRequest.setFastestInterval(10);
mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
//mLocationRequest.setSmallestDisplacement(0.1F);
// create the Intent to use WebViewActivity to handle results
Intent mRequestLocationUpdatesIntent = new Intent(this, LocationUpdateService.class);
// create a PendingIntent
mRequestLocationUpdatesPendingIntent = PendingIntent.getService(getApplicationContext(), 0,
mRequestLocationUpdatesIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
// request location updates
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient,
mLocationRequest,
mRequestLocationUpdatesPendingIntent);
}
@Override
public void onConnectionSuspended(int i) {
Toast.makeText(this,"onConnectionSuspended",Toast.LENGTH_SHORT).show();
}
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
Toast.makeText(this,"onConnectionFailed",Toast.LENGTH_SHORT).show();
}
}
产生的日志:
D/locationtesting﹕ accuracy: 10.0 lat: 37.779702 lon: -122.3931595
D/locationtesting﹕ accuracy: 10.0 lat: 37.7797023 lon: -122.3931594
D/locationtesting﹕ accuracy: 10.0 lat: 37.7797022 lon: -122.3931596
D/locationtesting﹕ accuracy: 10.0 lat: 37.7797021 lon: -122.3931597
D/locationtesting﹕ accuracy: 10.0 lat: 37.7797021 lon: -122.3931596
D/locationtesting﹕ accuracy: 10.0 lat: 37.7797019 lon: -122.3931597
D/locationtesting﹕ accuracy: 10.0 lat: 37.7797019 lon: -122.3931597
答案 1 :(得分:0)
本质上的意图服务用于终端任务,例如从调用活动或片段接收意图,在单独的线程上启动某些任务,以及静默完成,而不通知任何实体它的终止。还有一个注释文档,不应该为Intent Services([IntentService] [1])覆盖onStartCommand。我的猜测是,当您希望它的存在时,您的服务就会自动完成,因此,意图无法正确传递。
绑定服务将是一个更合适的选项,因为它们允许不同的组件附加到自身并执行所需的通信。
答案 2 :(得分:0)
您无法直接执行此操作 - 我的意思是requestLocationUpdates
并在IntentService
中获取这些更新。
您可以做的是在后台设置一个Service
,通过requestLocationUpdates
请求这些更新,并且一直在运行(请记住设备进入睡眠时的情况)。然后,当Service
位置更新时,会向IntentService
发送消息并在那里处理。
答案 3 :(得分:-1)
您可以使用pendingIntent的getService()方法,并且在服务的onStartCommand()中可以获得相应的意图。 getBroadcast()发送一个广播,你需要注册一个广播接收器来监听。希望这会有所帮助。