需求:应用开启后,每隔5分钟,向服务器发送一次自己的位置
public class LocationService extends Service {
private static boolean control = false;
private AlarmManager mManager;
private PendingIntent mPi;
public LocationService() {
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
//根据实际来 我这是根据自己服务器时间进行的
long lo = 1000 * 60 * 5;
mManager = (AlarmManager) getSystemService(ALARM_SERVICE);
//每隔多久请求一次 lo是时间 单位毫秒
long triggerAtTime = SystemClock.elapsedRealtime() + lo;
//开启广播
Intent i = new Intent(this, AlarmssReceiver.class);
mPi = PendingIntent.getBroadcast(this, 0, i, 0);
//启动
mManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, mPi);
//因为进入应用的时候已经发过一次定位了,所以第一次就不发从第二次开始
if (!control) {
control = true;
} else {
getaddress();
}
return super.onStartCommand(intent, flags, startId);
}
protected Location getAddress() {
return LocationUtil2.getInstance( this ).showLocation();
}
private void getaddress() {
double latitude, longitude;
Location location = getAddress();
if (location != null) {
//获取纬度
latitude = location.getLatitude();
//获取经度
longitude = location.getLongitude();
} else {
//如果拿不到位置,给一个默认位置
latitude = 40.0703973300;
longitude = 116.2290131700;
}
//因为我其他地方也要用到经纬度,所以存到sp中了,如果不需要可以没有这一步
SharedPreferencesUtils.getInstance().set(MyConstant.USER_latitude, String.valueOf(latitude));
SharedPreferencesUtils.getInstance().set(MyConstant.USER_longitude, String.valueOf(longitude));
//上传位置信息
RequestBusiness.getInstance().getAPI().api_addMemberLocation(
(String) SharedPreferencesUtils.getInstance().get(MyConstant.SESSIONID, ""),
String.valueOf(longitude), String.valueOf(latitude)
).enqueue(new Callback<BaseResponse>() {
@Override
public void onResponse(Call<BaseResponse> call, Response<BaseResponse> response) {
}
@Override
public void onFailure(Call<BaseResponse> call, Throwable t) {
}
});
}
@Override
public void onDestroy() {
//关闭的服务的时候同时关闭广播注册者
mManager.cancel(mPi);
super.onDestroy();
}
}
public class AlarmssReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent i = new Intent(context, LocationService.class);
//启动服务
context.startService(i);
}
}
使用方法:
在Activity中用startService的方式启动service
Intent i = new Intent(context, LocationService.class);
//启动服务
context.startService(i);
用startService的方式启动service,生命周期:启动时,startService –> onCreate() –> onStart()(可多次调用) ,Service running,停止时,stopService –> onDestroy()
每次执行context.startService(i);都会执行onStartCommand()方法
启动service的另一种方式:bindService()
因为这次没用到,就不写了,用到了再说,最后用原始方式获取经纬度的方法:点击