我已经构建了一个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
}
答案 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中注册/取消注册匿名广播接收器(再次,将您的操作作为过滤器)。