3

我对 Service 和 BroadcastReceiver 感到困惑。我正在开发基于位置的应用程序。在此,每当用户的位置发生重大变化(例如 10 米)时,我想将用户的位置存储到数据库中。

我正在使用 LocationListener 并且它工作正常。但我的困境是:在哪里编写 onLocationChanged() 方法 - 在 BroadcastReceiver 的 onReceive() 方法中还是在服务中?

如果我使用的是 Service ,那么我应该在 Service 的哪个方法中编写下面的代码?

这是我的位置监听器:

    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);

谁能建议我实施它的更好方法是什么?我已阅读有关 Service 和 BroadcastReceiver 的所有 Android 开发人员文档,但我仍然无法区分它们的用法?

4

3 回答 3

2

这取决于你的目的。如果您想在后台捕获位置,请在服务中使用。

BroadcastReciever 的 onReceive 方法只会在您注册接收什么动作时调用。

如果你想在 Foreground 中做,你可以简单地在 Activity 中使用它。但是当您的活动关闭时,您将无法获取位置。

所以,你根据你的功能来决定。

于 2012-10-19T12:59:31.593 回答
2

服务用于在后台运行您的代码,主要用于下载、音乐播放.. 用户将应用程序置于后台(按主页或返回按钮)后。 BroadcastReceivers用于接收通过sendBroadcast()方法发送的消息,并用于捕获系统通知,如蓝牙、互联网可​​用性、从其他应用程序获取消息......

我认为您想在这里使用服务,因为BroadcastReceiver如果应用程序在后台,则无法帮助您收听位置更改。

于 2012-10-19T13:02:09.647 回答
1

在我看来,这取决于你想做多少工作。

如果你想在收到广播时做一些小事,那么你可以在onReceive()你的BroadcastReceiver. 但是,onReceive()在主应用程序线程上调用。因此,如果时间过长,Android OS 会杀死它。

因此,如果你想做一些可能需要一段时间的事情,你应该在Service后台线程上做。正如建议的那样,您可以将代码放入服务的onStart()方法中。如果服务没有做任何事情(电池和其他资源的浪费),请不要让服务继续运行。每次收到广播时启动服务,并在完成分配的作业后立即完成。

PS Mark L. Murphy(又名 CommonsWare)有几本关于 Android 开发的优秀书籍。Google Busy Coder 的 Android 开发指南。

更新:

关于您希望在应用程序进入后台时取消后台任务。

考虑一下如果你的后台任务在中间被打断了你会怎么做。你需要处理这种情况。如果您对此感到满意,那么您可以使用其中一个AsyncTaskService在后台执行您的任务。您的选择再次取决于您的任务的大小和类型。

AsyncTask一般是为了在UI线程上执行后台操作和发布结果。Android 文档建议任务AsyncTask不应超过几秒钟。另一方面,Service设计用于在不与 UI 通信的情况下执行长时间操作。

关于取消。AsyncTask当你的活动完成时将被取消,因为它对 UI 线程很累。要停止服务,您需要stopService()从您的活动中调用。

由于您需要经常存储位置信息,因此您可以在活动开始时启动服务,使用服务的onBind()方法与其通信,然后在onPause()活动的方法中停止服务。

于 2012-10-19T20:02:31.997 回答