簡體   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