使用service和BroadcastReceiver实现定时像服务端发送当前位置

需求:应用开启后,每隔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() {
            @Override
            public void onResponse(Call call, Response response) {

            }

            @Override
            public void onFailure(Call 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()

因为这次没用到,就不写了,用到了再说,最后用原始方式获取经纬度的方法:点击

你可能感兴趣的:(android,定时传定位信息)