我在Service和broadcastReceiver之间感到困惑.我正在开发基于位置的应用.在这里,我想在他/她的位置发生重大变化时(例如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);
任何人都可以建议我实施它的更好方法是什么?我已经阅读了有关Service和broadcastReceiver的所有AndroID开发者文档,但我仍然无法区分它们的用法?
解决方法:
在我看来,这取决于你想做多少工作.
如果您想在收到广播时做一些小事,那么您可以在broadcastReceiver的onReceive()方法中执行此 *** 作.但是,在主应用程序线程上调用onReceive().因此,如果需要太长时间,AndroID *** 作系统将终止它.
因此,如果您想要做一些可能需要一段时间的事情,您应该在后台线程的服务中执行此 *** 作.正如建议的那样,您可以将代码放在服务的onStart()方法中.如果不执行任何 *** 作(电池腰部和其他资源),请不要继续运行服务.每次收到广播时启动服务,并在完成分配的作业后立即完成.
附: Mark L. Murphy(又名CommonsWare)有几本关于AndroID开发的优秀书籍. Google Busy Coder指南AndroID开发.
更新:
关于在应用程序转到后台时取消后台任务的愿望.
考虑如果您的后台任务在中间被中断,您将采取的措施.你需要处理这种情况.如果你没问题,那么你可以使用AsyncTask或Service在后台完成你的任务.您的选择又取决于您的任务的大小和类型.
AsyncTask通常用于执行后台 *** 作并在UI线程上发布结果. AndroID文档suggests,AsyncTask的任务不应超过几秒钟.另一方面,Service旨在执行长时间 *** 作而无需与UI通信.
关于取消.当您的活动完成时,AsyncTask将被取消,因为它对UI线程感到厌倦.要停止服务,您需要从您的活动中拨打@L_419_1@.
由于您需要经常存储位置信息,您可以在活动开始时启动服务,使用服务的onBind()方法与其进行通信,然后在活动的onPause()方法中停止服务.
总结以上是内存溢出为你收集整理的android – 经常获取和存储位置更好 – 服务或BroadcastReceiver?全部内容,希望文章能够帮你解决android – 经常获取和存储位置更好 – 服务或BroadcastReceiver?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)