位置背景使用GoogleApiClient的服务

时间:2015-01-27 16:11:41

标签: android geolocation google-play-services google-api-client

我想每次检查用户的坐标(前景和背景),如果他靠近某个地方,我会调用我的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 个答案:

答案 0 :(得分:0)

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

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