繁体   English   中英

Android位置更新作为后台服务

[英]Android location updates as background service

我是android的新手,正在开发应用程序以实现即使我退出应用程序也能获取我的位置更新的功能。即,无论我的应用程序处于活动状态是已终止,它都应继续更新服务器中的当前位置。

你们能建议我同样的方法吗? 非常感谢您的帮助...

这是使用处理程序每​​X分钟或每X米获取用户位置的代码。

Location gpslocation = null;

    private static final int GPS_TIME_INTERVAL = 60000; // get gps location every 1 min
    private static final int GPS_DISTANCE= 1000; // set the distance value in meter

    /*
       for frequently getting current position then above object value set to 0 for both you will get continues location but it drown the battery
    */

    private void obtainLocation(){
    if(locMan==null)
        locMan = (LocationManager) getSystemService(LOCATION_SERVICE);

        if(locMan.isProviderEnabled(LocationManager.GPS_PROVIDER)){
            gpslocation = locMan.getLastKnownLocation(LocationManager.GPS_PROVIDER);
            if(isLocationListener){
                 locMan.requestLocationUpdates(LocationManager.GPS_PROVIDER, 
                            GPS_TIME_INTERVAL, GPS_DISTANCE, GPSListener);
                    }
                }
            }
    }

处理程序

    private static final int HANDLER_DELAY = 1000*60*5;

    Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
            public void run() {
                myLocation = obtainLocation();
                handler.postDelayed(this, HANDLER_DELAY);
            }
        }, START_HANDLER_DELAY);

GPS定位监听器

private LocationListener GPSListener = new LocationListener(){
    public void onLocationChanged(Location location) {
        // update your location

    }

    public void onProviderDisabled(String provider) {
    }

    public void onProviderEnabled(String provider) {
    }

    public void onStatusChanged(String provider, int status, Bundle extras) {
    }
};

这是用于在后台服务中更新设备的纬度和经度的代码,它将始终在后台运行。 如果有人(人工或系统)停止该服务,它将永远不会停止,它将自动重新启动。

    public class LocationService extends Service implements LocationListener {

        LocationManager m_locationManager;

        @Override
        public void onCreate() {

            this.m_locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);

              Toast.makeText(getApplicationContext(), "Location Service starts", Toast.LENGTH_SHORT).show();

        }



        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            //TODO do something useful
            Toast.makeText(getApplicationContext(), "Service starts", Toast.LENGTH_SHORT).show();



            //  Here I offer two options: either you are using satellites or the Wi-Fi services to get user's location
            //  this.m_locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 3000, 0, this); //  User's location is retrieve every 3 seconds
            this.m_locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);

            this.m_locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 1, this);
        return START_STICKY;
        }


        @Override
        public IBinder onBind(Intent intent) {
            //TODO for communication return IBinder implementation
            return null;
        }


        @Override
        public void onDestroy() {
            super.onDestroy();
            Toast.makeText(getApplicationContext(), "Service Task destroyed", Toast.LENGTH_LONG).show();
            Intent myIntent = new Intent(getApplicationContext(), LocationService.class);

            PendingIntent pendingIntent = PendingIntent.getService(getApplicationContext(), 0, myIntent, 0);

            AlarmManager alarmManager1 = (AlarmManager) getSystemService(ALARM_SERVICE);

            Calendar calendar = Calendar.getInstance();

            calendar.setTimeInMillis(System.currentTimeMillis());

            calendar.add(Calendar.SECOND, 10);

            alarmManager1.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);

            Toast.makeText(getApplicationContext(), "Start Alarm", Toast.LENGTH_SHORT).show();
        }



        @Override
        public void onTaskRemoved(Intent rootIntent) {
            super.onTaskRemoved(rootIntent);
                Intent myIntent = new Intent(getApplicationContext(), LocationService.class);

                PendingIntent pendingIntent = PendingIntent.getService(getApplicationContext(), 0, myIntent, 0);

                AlarmManager alarmManager1 = (AlarmManager) getSystemService(ALARM_SERVICE);

                Calendar calendar = Calendar.getInstance();

                calendar.setTimeInMillis(System.currentTimeMillis());

                calendar.add(Calendar.SECOND, 10);

                alarmManager1.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);

                Toast.makeText(getApplicationContext(), "Start Alarm", Toast.LENGTH_SHORT).show();



        }


        @Override
        public void onLocationChanged(Location loc) {
            if (loc == null)    //  Filtering out null values
                return ;

            Double lat = loc.getLatitude();
            Double lon = loc.getLongitude();
    //        Toast.makeText(getApplicationContext(),"Latitude = "+lat+ "\nLongitude = "+lon, Toast.LENGTH_SHORT).show();

        //    new UpdateLatitudeLongitude(LocationService.this, lat, lon,).execute();

//Calling AsyncTask for upload latitude and longitude
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {

        }

        @Override
        public void onProviderEnabled(String provider) {

        }

        @Override
        public void onProviderDisabled(String provider) {

        }






        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM