我把服务和广播接收器混淆了。我正在开发一个基于位置的应用程序。在这里,每当用户的位置发生重大变化(例如10米)时,我想将用户的位置存储到数据库中。
我正在使用LocationListener,它运行良好。但我的难题是:在哪里编写onLocationChanged()方法-在BroadcastReceiver的onReceive()方法中还是在服务中?
如果我使用的是服务,那么我应该用哪种服务方法来编写下面的代码?
这是我的位置听众:

    LocationManager locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);

    LocationListener locationListener = new LocationListener() {
        public void onLocationChanged(Location location) {
            if(location != null){
                //Code to populate location-data into the database table.
            }

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

        public void onProviderEnabled(String provider) {}

        public void onProviderDisabled(String provider) {}
      };

    locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 5, 10, locationListener);

有谁能给我提一个更好的实施方法吗?我已经阅读了所有关于服务和广播接收器的android开发文档,但我仍然无法区分它们的使用情况?

最佳答案

在我看来,这取决于你想做多少工作。
如果你想在接收广播时做一些小事情,那么你可以在onReceive()BroadcastReceiver方法中完成。但是,onReceive()是在主应用程序线程上调用的。所以,如果时间太长的话,android操作系统会杀了它。
因此,如果您想做一些可能需要一段时间的事情,您应该在Service中在后台线程上完成。正如所建议的,您可以将代码放入服务的onStart()方法中。如果服务不起任何作用,就不要让它继续运行(电池腰和其他资源)。每次接收广播时启动服务,并在广播完成分配的任务后立即完成。
P.S.MarkL.Murphy(又名Commonware)有几本关于Android开发的优秀书籍。google busy编码器指南android开发。
更新:
当应用程序转到后台时取消后台任务的愿望。
考虑一下如果你的后台任务在中间被中断了,你会怎么做。你需要处理这种情况。如果您对此没问题,那么您可以使用AsyncTaskService在后台执行任务。您的选择又取决于任务的大小和类型。
AsyncTask通常用于在ui线程上执行后台操作和发布结果。android文档suggestsAsyncTask的任务不应超过几秒。另一方面,Service设计用于执行长时间操作,而无需与ui通信。
关于取消。AsyncTask将在您的活动完成时取消,因为它对ui线程很累。要停止服务,您需要在活动中呼叫stopService()
由于您需要经常存储位置信息,因此可以在活动开始时启动服务,使用服务的onBind()方法与它通信,然后在活动的onPause()方法中停止服务。

09-15 16:11