从 Android 后台服务问题获取当前位置

Posted

技术标签:

【中文标题】从 Android 后台服务问题获取当前位置【英文标题】:Get Current Location From Android Background Service Issue 【发布时间】:2013-05-06 12:26:37 【问题描述】:

我想开发基于位置的提醒应用程序。因此,即使应用程序未运行,我也想使用 android 服务获取当前位置。但我没有这样做。我在 android 服务类中设置了计时器,但我不知道如何在服务类中获取当前位置。问题是什么 ?我遇到了这样的错误:

无法在未调用 looper.prepare() 的线程内创建处理程序

public class TrackerService extends Service 

    double latShared;
    double lngShared;
    double latService;
    double lngService;
    private LocationManager lm;
    Timer timer;
    Handler handler;
    final static long TIME = 15000;
    SharedPreferences mSharedPrefs;
    SharedPreferences.Editor mPrefsEditor;



    @Override
    public IBinder onBind(Intent intent) 
        // TODO Auto-generated method stub
        return null;
    

    @Override
    public void onCreate() 
        mSharedPrefs = getSharedPreferences("locationXML", MODE_PRIVATE);
        latShared = (double)mSharedPrefs.getFloat("lat", 0);
        lngShared = (double)mSharedPrefs.getFloat("lng", 0);
        timer = new Timer();
        timer.schedule(new TimerTask()
            @Override
            public void run()
                LocationUpdates();
            
        ,0,TIME);

        

    public void LocationUpdates()
        locListener locList = new locListener();
        lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);   
        lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locList);
    

    @Override
    public void onDestroy() 
        //lm.removeUpdates(this);
        timer.cancel();
    

    public class locListener implements LocationListener

        @Override
        public void onLocationChanged(Location location) 
            latService = location.getLatitude();
            lngService = location.getLongitude();
        

        @Override
        public void onProviderDisabled(String provider) 

        @Override
        public void onProviderEnabled(String provider) 

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


    


【问题讨论】:

您可以在 onResume() 中对位置更新请求使用 like 调用请求,并在 onpause() 中删除更新调用。 【参考方案1】:

LocationManager.requestLocationUpdates 应该在 UI 线程 上运行,正如其 sibling 方法所定义的那样。另一方面,TimerTask 引入了一个新线程来卸载其执行。

但是,如果您没有为您的服务使用新流程,则只需调用LocationUpdates(),如下所示:

@Override
protected void onCreate() 
    mSharedPrefs = getSharedPreferences("locationXML", MODE_PRIVATE);
    latShared = (double)mSharedPrefs.getFloat("lat", 0);
    lngShared = (double)mSharedPrefs.getFloat("lng", 0);

    final Handler h = new Handler();
    h.post(new Runnable() 
        @Override
        public void run() 
            LocationUpdates();
            h.postDelayed(this, TIME);
        
    );

或者,如果您不想使用处理程序,那么只需升级您的requestLocationUpdates,如下所示:

lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locList, getMainLooper());

在上述情况下,getMainLooper() 将从 UI 线程调度您的位置更新。

【讨论】:

以上是关于从 Android 后台服务问题获取当前位置的主要内容,如果未能解决你的问题,请参考以下文章

将 Gps 作为后台服务运行并将接收到的当前位置数据与 Sqlite 中的值进行比较?

如何在后台模式下获取当前位置并在后台模式下继续将该位置发送到服务器

Android - 如何在服务的后台获取位置更新

android在后台获取位置并更新listview

在后台连续获取当前位置

Android Xamarin 后台服务 - 每 x 分钟获取一次 GPS 位置?