Send location updates to IntentService
如何将位置更新直接发送到Intent Service? 以下方法不起作用。 调用OnConnected函数,但从未在服务中接收到intent:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | ... 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); } ... |
意向服务:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | 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"); } } |
清单文件:
1 2 3 | ... <service android:name=".LocationUpdateService" /> ... |
以下是工作和测试的代码,它们根据此处的代码成功地将IntentService设置为PendingIntent中包含的PentIntent的接收器。
首先,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | 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()); } } } } |
以下是使用发送到
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | 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(); } } |
产生的日志:
1 2 3 4 5 6 7 | 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 |
你不能直接这样做 - 我的意思是
你可以做的是在后台有一个
本质上的意图服务用于终端任务,例如从调用活动或片段接收意图,在单独的线程上启动某些任务,以及静默完成,而不通知任何实体它的终止。还有一个注释文档,不应该为Intent Services([IntentService] [1])覆盖onStartCommand。我的猜测是,当您希望它的存活时,您的服务就会完成,因此,意图无法正确传递。
绑定服务将是更合适的选项,因为它们允许不同的组件附加到自身并执行所需的通信。
您可以使用pendingIntent的getService()方法,并在服务的onStartCommand()中获取相应的意图。 getBroadcast()发送一个广播,你需要注册一个广播接收器来监听。希望这可以帮助。