前言

做移动GIS开发经常会使用到定位功能,很多时候通过代码里的手写定位代码在Activity中就实现了。虽然比较简单,但是也会有一些问题,比如定位慢,代码杂乱。一直都知道可以通过Service进行后台定位,也没有实践过,在网上找了一些代码也都比较乱,还有的代码居然是通过service和百度SDK进行定位的,这里记录一下博主是如何通过Service实现定位的。

AndroidManifest.xml

这个文件里主要有两处需要注意:

  • 添加权限
  • 注册Service
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.locationservice"><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /><uses-permission android:name="android.permission.INTERNET" /><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.LocationService"><activityandroid:name=".MainActivity"android:exported="true"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><service android:name=".LocationServer"/></application></manifest>

LocationServer

  • 定位功能实现
  • 回调
  • Activity 绑定
package com.example.locationservice;import android.Manifest;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;import androidx.annotation.Nullable;
import androidx.core.app.ActivityCompat;public class LocationServer extends Service {private Callback callback;//绑定相关接口@Nullable@Overridepublic IBinder onBind(Intent intent) {return new Binder();}public class Binder extends android.os.Binder {public LocationServer getService() {return LocationServer.this;}}@Overridepublic void onCreate() {Log.e("sss","创建定位服务");LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {//          未授权则返回return;}locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0.0f, mLocationListener);locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000, 0.0f, mLocationListener);}@Overridepublic void onDestroy() {super.onDestroy();}public void setCallback(Callback callback) {this.callback = callback;}//回调类public static interface Callback {void onDataChange(Location location);}//定位实现private LocationListener mLocationListener = new LocationListener() {@Overridepublic void onLocationChanged(Location location) {if(callback!=null){callback.onDataChange(location);}}@Overridepublic void onStatusChanged(String provider, int status, Bundle extras) {}@Overridepublic void onProviderEnabled(String provider) {}@Overridepublic void onProviderDisabled(String provider) {}};
}

MainActivity

我这里使用easypermission的库进行了一个权限的申请,注意在build.gradle文件中,添加依赖

  implementation 'pub.devrel:easypermissions:3.0.0'
package com.example.locationservice;import androidx.appcompat.app.AppCompatActivity;import android.Manifest;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.location.Location;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.util.Log;
import android.widget.Toast;import pub.devrel.easypermissions.AfterPermissionGranted;
import pub.devrel.easypermissions.EasyPermissions;public class MainActivity extends AppCompatActivity implements ServiceConnection {public static final int RESULT_CODE = 1001;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);methodRequiresTwoPermission();}//动态权限框架@AfterPermissionGranted(RESULT_CODE)private void methodRequiresTwoPermission() {String[] perms = {Manifest.permission.INTERNET, Manifest.permission.ACCESS_FINE_LOCATION};if (EasyPermissions.hasPermissions(MainActivity.this, perms)) {//            final Intent intentStart = new Intent(MainActivity.this, LocationServer.class);
//            startService(intentStart);Log.e("sss","绑定服务");bindService(new Intent(this, LocationServer.class), this, BIND_AUTO_CREATE);} else {EasyPermissions.requestPermissions(MainActivity.this, "请求获取您的位置信息和本地读写权限",RESULT_CODE, perms);}}@Overridepublic void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);// Forward results to EasyPermissionsEasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);}@Overridepublic void onServiceConnected(ComponentName componentName, IBinder iBinder) {Log.e("ss","绑定回调");LocationServer.Binder binder = (LocationServer.Binder) iBinder;LocationServer myService = binder.getService();myService.setCallback(new LocationServer.Callback() {@Overridepublic void onDataChange(Location location) {Message msg = new Message();msg.obj = location;handler.sendMessage(msg);String strcontent=location.getLatitude()+","+location.getLongitude()+","+location.getAccuracy();// 每次写入时,都换行写String strContent = strcontent + "\r\n";Log.e("定位结果",strContent);Toast.makeText(MainActivity.this,strContent,Toast.LENGTH_LONG).show();}});}@Overridepublic void onServiceDisconnected(ComponentName componentName) {}private final Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);Toast.makeText(MainActivity.this, msg.obj.toString(), Toast.LENGTH_LONG);}};
}

运行结果

Android 通过Service 实现后台GPS定位相关推荐

  1. android功耗(23)---gps定位开发省电要点

    android手机gps定位开发省电要点 android手机使用GPS定位会非常费电.google工程师在quora上做了具体的解释,有兴趣可以看看 https://www.quora.com/Bat ...

  2. 使用Android的Service实现后台定时检测并重启应用

    Android的Service使用一例,后台任务定时检测并定时重启应用. Service简述: Service(服务)是一个一种可以在后台执行长时间运行操作而没有用户界面的应用组件.服务可由其他应用组 ...

  3. 关于android双进程守护-后台持续定位功能+项目IM中写到自己的即时通讯

    1.关于进程守护无非就是6.0以下,6.0以上的高版本保活 a.android中6.0以下的保护采用双线程守护即可是aidl (1)创建aidl文件 interface IServiceAidlInt ...

  4. iphone gps android,iPhoneX与iPhone8出现GPS定位不准故障 新版iOS系统或能修复

    [TechWeb报道]11月10日消息,据国外媒体AppleInsider报道,在苹果社区支持论坛上,不断有帖子表明,iPhone X和iPhone 8手机在GPS定位的精度上出现了问题,但最新的iO ...

  5. Android百度地图调用和GPS定位

    1.声明权限内容 其中的百度地图的key需要在百度地图的开发者上申请 申请key需要用到包名和SHA1 Window→preference→Android→Build 中有 package=" ...

  6. android使用高德地图SDK获取定位信息

    注册账号.创建应用.获取API KEY等这些就不说了,按照官网来就行,我们来讲讲项目的配置及示例代码. 高德地图获取定位信息配置要比百度地图简单多了,这是我比较喜欢的一点,而且之前用百度地图嵌入一个应 ...

  7. 【老文档】后台GPS高耗电拦截管控

    提案名称* 后台GPS高耗电拦截管控 发明人* xxx 交底书撰写人* xxx 撰写人联系方式* 手机:xxxx 邮箱:xxxx 一.发明背景 * Android 系统中提供4种方式给上层应用获取定位 ...

  8. 高德地图八:手机定位和GPS定位

    高德地图八:手机定位和GPS定位 高德地图八:手机定位和GPS定位 代码实现: layout/activity_main.xml <?xml version="1.0" en ...

  9. GPS定位流程_(1)

    GPS定位流程_(1) 1.1 Android定位架构 整个定位服务的架构如上图 所示.该结构共分为五层: 第一层是应用层,app层,需要定位服务的客户端. 第二层是框架层,这一层实现了系统服务,主要 ...

最新文章

  1. vmtouch--the Virtual Memory Toucher
  2. AutoCAD .NET API二次开发学习指南
  3. 《JavaScript 高级程序设计》 7.5 常用模式
  4. python 分词 识别_python分词如何实现新词识别
  5. 关于c语言的数据类型常量的理解
  6. TreeCtrl 查找功能的最简单实现
  7. Flash背景透明的代码
  8. 剖析CWE视图的层次定义和解析方式
  9. prim算法 最小生成树
  10. 《IT行业职位介绍-搞懂高级程序员、架构师、技术总监、CTO从薪资到技能的区别》
  11. 《跟小智一起学网络》教程目录
  12. 源代码 格式化 php,CoolFormat源代码格式化工具
  13. 2022-2028全球及中国食品加工机械行业研究及十四五规划分析报告
  14. win10系统下载安装PS2015
  15. DARTS论文和算法解析
  16. 解决File ~ could only be written to 0 of the 1 minReplication nodes.
  17. connect函数的第五个参数特点
  18. 2021-04-28 几种粘贴复制
  19. LFM和ALS的理解
  20. SQL SERVER存储过程AS和GO的含义

热门文章

  1. 基于zynq的千兆网udp项目_米联客 ZYNQ/SOC 精品教程 S05-CH05 PS 千兆 UDP 加速
  2. 原文 葛底斯堡宣言_葛底斯堡演说中英对照全文
  3. 拒绝断网失联!卫星电话成为户外徒步、海洋通信等领域的必备终端
  4. WWDC2016 Session笔记 - Xcode 8 Auto Layout新特性
  5. 学生缴费系统java源码_学生缴费管理系统
  6. C++解析JSON格式数据
  7. Scrapy爬图片入门——静态网站翻页爬虫
  8. matlab路径选择函数,Matlab路径设置相关函数及指令
  9. 软件测试 教案doc,软件测试基础授课教案.doc
  10. bp神经网络是用来干嘛的,神经网络bp是什么意思