使用 GoogleApiClient 的位置后台服务

Posted

技术标签:

【中文标题】使用 GoogleApiClient 的位置后台服务【英文标题】:Location background Service using GoogleApiClient 【发布时间】:2015-01-27 16:11:41 【问题描述】:

我想每次都检查用户的坐标(前景和背景),如果他靠近某个地方,我会调用我的 API 并发送 GCM。

所以我在重启设备后调用了一个 BroadcastReceiver。

    <receiver android:name=".LocationReceiver"
        android:enabled="true"
        android:exported="false">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>

这个接收者以这种方式调用一个服务:

public void onReceive(Context context, Intent intent) 
    ComponentName comp = new ComponentName(context.getPackageName(),
            LocationService.class.getName());
    startWakefulService(context, (intent.setComponent(comp)));
    setResultCode(Activity.RESULT_OK);

此 LocationService 正在使用 GoogleApiClient 获取位置并检查与我所在位置的距离。

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

@Override
public void onCreate() 
    super.onCreate();
    mGoogleClient = new GoogleApiClient.Builder(this, this, this)
            .addApi(LocationServices.API)
            .build();

当我得到一个新位置时,我用这个新位置调用一个名为 LocationHandler 的 IntentService

@Override
public void onConnected(Bundle bundle) 
    LocationRequest locationRequest = LocationRequest.create()
            .setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY)
            .setFastestInterval(5000L)
            .setInterval(10000L)
            .setSmallestDisplacement(75.0F);
    PendingIntent pendingIntent = PendingIntent.getService(this, 0,
            new Intent(this, LocationHandler.class),
            PendingIntent.FLAG_UPDATE_CURRENT);
    LocationServices.FusedLocationApi.requestLocationUpdates(
            mGoogleClient, locationRequest, pendingIntent);

此处理程序验证距离并调用 API

public class LocationHandler extends IntentService 

@Override
protected void onHandleIntent(Intent intent) 
    final Location location = intent.getParcelableExtra(FusedLocationProviderApi.KEY_LOCATION_CHANGED);
    if (location != null) ...

我想我遗漏了一些东西,因为这个流程是在重启后触发的,但是...... 如何从我的应用的第一个活动中调用所有这些步骤?

还有什么我做错了吗?

谢谢!

【问题讨论】:

【参考方案1】:

在第二个代码块的 onReceive() 方法中,您调用了 startWakefulService 来让球滚动。如果您想从活动而不是系统触发的意图中获得相同的效果,只需以指向您的 LocationService 的相同方式调用 startService()。

http://developer.android.com/reference/android/content/Context.html#startService%28android.content.Intent%29

【讨论】:

以上是关于使用 GoogleApiClient 的位置后台服务的主要内容,如果未能解决你的问题,请参考以下文章

如何将 GoogleApiClient 位置服务与 Google Api 一起使用?

Android使用GoogleApiClient获取用户位置纬度和经度[重复]

使用 Google API 进行后台位置更新 - Fused Location Provider 不准确

GoogleApiClient 中的 getLastLocation() 始终为空

立即删除位置更新

GoogleApiClient onConnectionSuspended ,我应该再次调用 mGoogleApiClient.connect() 吗?