背景
最近遇到了这样一个需求:实现一个实时定位功能,并将定位到的信息上传至服务器。
思路
首先实现一个长生命周期的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();
}
@Ove