我的应用程序,要求是在后台启动我的服务,当某些甚至发生时,例如拨打特定的电话号码。在那次活动之后,我需要获取用户位置并将其发送到网络。
这是我迄今为止所做的,广播接收器处理均匀,然后我启动我的服务。 我正在使用该服务来获取用户的当前位置,为了实现这一点,我在后台运行我的服务,这个循环器和消息概念,通过重写handleMessage,并通过onStartCommand overriding传递意图信息。 这是代码
@Override
public boolean handleMessage(Message message) {
Intent intent = (Intent) message.obj;
String action = intent.getAction();
if (START_EMERGENCY_SERVICE_ACTION.equalsIgnoreCase(action)) {
startMonitoring();
} else if (STOP_EMERGENCY_SERVICE_ACTION.equalsIgnoreCase(action)){
stopMonitoring();
stopSelf();
}
return true;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
mHandler.sendMessage(mHandler.obtainMessage(0, intent));
return START_STICKY;
}
private void startMonitoring() {
LocationManager lm = (LocationManager) getSystemService(LOCATION_SERVICE);
lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, mLocationListener, mHandlerThread.getLooper());
}
在我的位置监听器类中,我正在使用其位置更新方法正确获取当前位置。
@Override
public void onLocationChanged(Location location) {
Location bestLocation = getBestLocation(location);
if (bestLocation != lastLocation) {
Log.i(getClass().getSimpleName(),
String.format("Location Changed %s @ %d %f:%f (%f meters)",
bestLocation.getProvider(),
bestLocation.getTime(),
bestLocation.getLatitude(),
bestLocation.getLongitude(),
bestLocation.getAccuracy()));
}
}
现在,我的挑战是将此位置发送到我的Web服务器,该服务器具有其他API。以前我在一个活动中使用了带有AsyncTask的httpUtil,但是如何在后台活动中做同样的事情。我应该启动另一个后台服务来进行服务器通信。我也对其他架构更改持开放态度。
我必须从2.3开始支持,现在我正在使用较旧的位置方式,但将来它应该具有足够的可扩展性以便迁移到融合位置。
答案 0 :(得分:1)
由于您的服务已在后台线程上运行,因此将Web服务代码直接实现到服务中没有任何问题。如果您不希望Web服务调用阻止该线程,您还可以使用服务中的另一个线程/ AsyncTask / etc。