ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

android – 经常获取和存储位置更好 – 服务或BroadcastReceiver?

2019-09-01 17:27:38  阅读:187  来源: 互联网

标签:android service location broadcastreceiver


我在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线程感到厌倦.要停止服务,您需要从您的活动中拨打stopService().

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

标签:android,service,location,broadcastreceiver
来源: https://codeday.me/bug/20190901/1784928.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有