我应该创建GPS跟踪APP服务? [英] Should I create service for GPS tracking APP?

查看:116
本文介绍了我应该创建GPS跟踪APP服务?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我写一个位置服务的应用程序,登录,用户一直的每一分钟。 我应该创建为GPS进程的服务?或者只是创建LocationManager的活动?哪一个更好?

I am writing a location service App that log where the user has been every minute. Should I create a service for the GPS process? OR just create the LocationManager at the Activity? Which one is better?

此外,我试图隐瞒由pressing硬件主页按钮的应用程序,并关闭GPS在设置 - >位置。我发现,在App一个小时内自动关闭。 是否有可能保持应用程序始终活着?

Moreover, I have tried to hide the application by pressing hardware home button and turn off GPS at Setting -> Location. I found that the App closed automatically within an hour. Is it possible to keep the application always alive?

推荐答案

我强烈建议创建GPS最起码作为活动的一个线程,如果你想成为华而不实将其设置为从服务和广播意图里面的AsyncTask的。将其设置为一个服务使得它有点模块化的,如果你想使用其他应用程序或其他活动。这就是我的方式来实现它。

I highly recommend creating the gps at the very least as a thread in the activity, if you want to be slick set it up as a service and broadcast intents from inside an asynctask. Setting it up as a service makes it a bit modular if you want to use it for other applications or in other activities. Thats the way I implemented it.

它也更容易,如果你从一个服务,而不是你的活动运行它来控制你的GPS数据的生命周期,所以服务犯规被打断,如果你做切换活动等。例如下面的AsyncTask部分:

Its also easier to control the lifetime of your gps readings if you run it from a service instead of your activity, so service doesnt get interrupted if you do switch activities etc.. example of asynctask portion below:

    /** Begin async task section ----------------------------------------------------------------------------------------------------*/
    private class PollTask extends AsyncTask<Void, Void, Void> { //AsyncTask that listens for locationupdates then broadcasts via "LOCATION_UPDATE" 
        // Classwide variables
        private boolean trueVal = true;
        Location locationVal;
        //Setup locationListener
        LocationListener locationListener = new LocationListener(){ //overridden abstract class LocationListener
            @Override
            public void onLocationChanged(Location location) {
                handleLocationUpdate(location);
            }
            @Override
            public void onProviderDisabled(String provider) {
            }
            @Override
            public void onProviderEnabled(String provider) {
            }
            @Override
            public void onStatusChanged(String provider, int status,
                    Bundle extras) {
            }
        };

        /** Overriden methods */
        @Override 
        protected Void doInBackground(Void... params) { 
            //This is where the magic happens, load your stuff into here
            while(!isCancelled()){ // trueVal Thread will run until you tell it to stop by changing trueVal to 0 by calling method cancelVal(); Will also remove locationListeners from locationManager
                Log.i("service","made it to do in background");
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                }
            return null; 

        }

        @Override
        protected void onCancelled(){
            super.onCancelled();
            stopSelf();
        }

        @Override
        protected void onPreExecute(){ // Performed prior to execution, setup location manager
            locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
            if(gpsProvider==true){
                locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
            }
            if(networkProvider==true){
                locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);
            }
        }

        @Override 
        protected void onPostExecute(Void result) { //Performed after execution, stopSelf() kills the thread
            stopSelf(); 
        } 

        @Override
        protected void onProgressUpdate(Void... v){ //called when publishProgress() is invoked within asynctask
                //On main ui thread, perform desired updates, potentially broadcast the service use notificationmanager
                /** NEED TO BROADCAST INTENT VIA sendBroadCast(intent); */
                Intent intent = new Intent(LOCATION_UPDATE);
                //Put extras here if desired
                intent.putExtra(ACCURACY, locationVal.getAccuracy()); // float double double long int
                intent.putExtra(LATITUDE, locationVal.getLatitude());
                intent.putExtra(LONGITUDE, locationVal.getLongitude());
                intent.putExtra(TIMESTAMP, locationVal.getTime());
                intent.putExtra(ALTITUDE,locationVal.getAltitude());
                intent.putExtra(NUM_SATELLITES,0);/////////////****TEMP
                sendBroadcast(intent); //broadcasting update. need to create a broadcast receiver and subscribe to LOCATION_UPDATE
                Log.i("service","made it through onprogress update");
        }

        /** Custom methods */

        private void cancelVal(){ //Called from activity by stopService(intent) --(which calls in service)--> onDestroy() --(which calls in asynctask)--> cancelVal()
            trueVal = false;
            locationManager.removeUpdates(locationListener);
        }

        private void handleLocationUpdate(Location location){ // Called by locationListener override.
            locationVal = location;
            publishProgress();
        }

    } 

这篇关于我应该创建GPS跟踪APP服务?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆