如何在活动中接收广播位置?

时间:2011-10-10 17:11:04

标签: android

我已经构建了一个IntentService来在后台收集位置数据(用户的知识)。它使用PendingIntent来接收位置,而不是LocationListener。我收到的地点很好。

但是如何从活动中获取这些位置?我可以直接接收位置广播,还是需要发送新类型的广播来接收活动?

服务:

    Intent activeIntent = new Intent(this, LocationReceiver.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, activeIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    LocationManager locationManager = (LocationManager) (App.getInstance().getSystemService(Context.LOCATION_SERVICE));
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, LOCATION_TIME_CHANGE, LOCATION_DISTANCE_CHANGE, pendingIntent);
    locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, LOCATION_TIME_CHANGE, LOCATION_DISTANCE_CHANGE, pendingIntent);
    locationManager.requestLocationUpdates(LocationManager.PASSIVE_PROVIDER, LOCATION_TIME_CHANGE, LOCATION_DISTANCE_CHANGE, pendingIntent);

接收器:

@Override
public void onReceive(Context context, Intent intent) {
    Bundle b = intent.getExtras();
    Location loc = (Location)b.get(android.location.LocationManager.KEY_LOCATION_CHANGED);
    // TODO handle the location here
}

1 个答案:

答案 0 :(得分:4)

我会使用相同的广播事件。

为您的意图定义更通用的操作。

Intent activeIntent = new Intent("com.mypackage.myproduct.ACTION_LOCATION_CHANGED");
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, activeIntent, PendingIntent.FLAG_UPDATE_CURRENT);
...

然后,在您的Manifest中注册LocationReceiver并将该操作作为过滤器。这样,您将始终在LocationReceiver

中收到广播

最后,要在您的活动中获得广播,请在onResume / onPause中注册/取消注册匿名广播接收器(再次,将您的操作作为过滤器)。