我把服务和广播接收器混淆了。我正在开发一个基于位置的应用程序。在这里,每当用户的位置发生重大变化(例如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开发。
更新:
当应用程序转到后台时取消后台任务的愿望。
考虑一下如果你的后台任务在中间被中断了,你会怎么做。你需要处理这种情况。如果您对此没问题,那么您可以使用AsyncTask
或Service
在后台执行任务。您的选择又取决于任务的大小和类型。AsyncTask
通常用于在ui线程上执行后台操作和发布结果。android文档suggests中AsyncTask
的任务不应超过几秒。另一方面,Service
设计用于执行长时间操作,而无需与ui通信。
关于取消。AsyncTask
将在您的活动完成时取消,因为它对ui线程很累。要停止服务,您需要在活动中呼叫stopService()
。
由于您需要经常存储位置信息,因此可以在活动开始时启动服务,使用服务的onBind()
方法与它通信,然后在活动的onPause()
方法中停止服务。