背景
最近遇到了这样一个需求:实现一个实时定位功能,并将定位到的信息上传至服务器。
思路
首先实现一个长生命周期的Service服务;
其次通过BroadcastReceiver监听系统广播,当Service被杀死的时候重新启动服务;
然后采用百度地图进行定时定位;
最后使用SharedPreferences将定位信息过滤后通过WebSocket上传至服务器。
实现
Service服务
public class LocateService extends Service {
private boolean isRun = true;
private MapLocationHelper location;
private SharedPreferencesHelper sp;
private WebSocket socket;
private Gson mGson;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
initData();
return START_STICKY;
}
/**
* 初始化数据
*/
private void initData() {
isRun = true;
location = MapLocationHelper.getInstance();
sp = SharedPreferencesHelper.getInstance();
socket = WebSocket.getInstance();
if (mGson == null) {
mGson = new Gson();
}
thread.start();
}
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
while (isRun) {
try {
Message msg = new Message();
msg.what = 1;
mHandler.sendMessage(msg);
Thread.sleep(3000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
});
Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 1:
if (location.isLocation() == false) {
location.startLocation();
}
String longitude = String.valueOf(location.getLongitude());
String latitude = String.valueOf(location.getLatitude());
if (location.getLongitude() != 0.0 && location.getLatitude() != 0.0) {
if (!sp.get("longitude", "").equals(longitude)
|| !sp.get("latitude", "").equals(latitude)) {
sp.put("longitude", longitude);
sp.put("latitude", latitude);
String str = mGson.toJson(new Format(200,
new Locate(longitude, latitude)));
socket.sendMessage(str);
}
}
break;
}
}
};
/**
* 重启服务
*/
private void restartService() {
if (!ServiceUtil.isServiceRunning(this, Constant.SERVICE_NAME)) {
isRun = false;
MapLocationHelper.getInstance().stopLocation();
WebSocket.getInstance().closeConnect();
SharedPreferencesHelper.getInstance().clear();
Intent intent = new Intent(this, LocateService.class);
this.startService(intent);
}
}
@Override
public void onTrimMemory(int level) {
super.onTrimMemory(level);
restartService();
}

本文介绍了如何结合Service和WebSocket实现实时定位功能。通过创建Service进行定位管理,使用百度地图API获取经纬度,利用BroadcastReceiver监听系统广播以在被杀死后重启服务。定位信息经过过滤后,通过WebSocket连接发送至服务器。同时,文章提到了WebSocket的优缺点,并讨论了Android应用的后台设置,如隐藏APP和管理任务列表。
最低0.47元/天 解锁文章
468





