从Android 8.0开始系统为实现降低功耗,对后台应用获取用户位置信息频率进行了限制,每小时只允许更新几次位置信息,详细信息请参考官方说明。按照官方指引,如果要提高位置更新频率,需要后台应用提供一个前台服务通知告知。

所以原来的单单使用locationManager获得当前位置在后台情况下无法使用了。于是打算使用一个前台服务,当app在后台时也能获得当前位置。

查了几篇博客说前台服务需要在service的onStartCommand方法中调用startForeground(int, Notification)才能开启前台服务。

但是onStartCommand需要走startservice()的生命周期才会调用。

我改用了bindservice() 正好需要activity和service交互,当然两个启动方法混用也可以。但是没有必要。

我需要的只是和控件绑定的service并且不想处理服务的结束操作。

1、activity / fragment调用 绑定服务

Intent serviceIntent = new Intent(this, ForegroundLocationService.class);

bindService(serviceIntent, conn, Service.BIND_AUTO_CREATE);

// 绑定服务时要求传入一个ServiceConnection实现类的对象

// 绑定服务时,会触发服务的onBind方法,此方法会返回一个Ibinder的对象给activity / fragment的onServiceConnected(),通过这个对象可以访问服务中的方法

ServiceConnection conn = new ServiceConnection() {

@Override

public void onServiceDisconnected(ComponentName name) {

}

@Override

public void onServiceConnected(ComponentName name, IBinder service) {

}

};

2、我在onBind()方法中调用了startForeground(int, Notification)

第一个参数是一个不为0的正整数,代表通知的id,第二个参数代表需要显示的通知。

适配8.0的通知构建需要适配,不然会导致你的通知无法显示(第一次调用的时候还以为是一加拦截了通知)

3、那么这时候应该已经实现了前台服务,需要把服务获得的位置信息传递给activity。(直接调用locationmanager就可以获得,这里把位置实现隐去)

public class MyBinder extends Binder {

public ForegroundLocationService getService(){

return ForegroundLocationService.this;

}

}

//通过binder实现调用者client与Service之间的通信

private MyBinder binder = new MyBinder();

//通过service的onBind()方法返回我们实例化的MyBinder对象,该对象可以获的当前的Service

@Override

public IBinder onBind(Intent arg0) {

NotificationUtils notificationUtils = new NotificationUtils(this);

startForeground(111, notificationUtils.getNotification("Notice", "Continuous positioning",null));

return binder;

}

4、然后需要进行控件和服务的交互,这里就分成了三种方法

在得到service的情况下act主动调用得到数据

在service中设置回调,service主动传递数据给act

通过广播传递数据。

ServiceConnection conn = new ServiceConnection() {

@Override

public void onServiceDisconnected(ComponentName name) {

}

@Override

public void onServiceConnected(ComponentName name, IBinder service) {

//通过这个方法可以得到service的实例,通过设置回调可以持续更新

ForegroundLocationService foregroundLocationService = ((ForegroundLocationService.MyBinder) service).getService();

foregroundLocationService.setLocationCallback(new ForegroundLocationService.LocationCallback() {

@Override

public void onLocation(Location location) {

}

});

}

};

在service中编写接口,并在获得位置的回调方法中调用。

public interface LocationCallback {

/**

* 当前位置

*/

void onLocation(Location location);

}

private LocationCallback mLocationCallback;

private class LocationListener implements android.location.LocationListener {

public LocationListener(String provider) {

Logger.e(TAG, "LocationListener " + provider);

}

@Override

public void onLocationChanged(Location location) {

Log.i("location", "onLocationChanged: " + "当前坐标:" + location.getLatitude() + " : " + location.getLongitude());

if(mLocationCallback!=null){

mLocationCallback.onLocation(location);

}

}

}

Service向Activity发送消息,可以使用广播,当然Activity要注册相应的接收器。比如Service要向多个Activity发送同样的消息的话,用这种方法就更好,这里就省略不写了。具体可以参考下面的文章。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

android 8.0后台定位,Android8.0适配前台定位服务service的示例代码相关推荐

  1. android7虚拟定位,Android8.0还早 EMUI助推Android7.0普及

    5月17日至19日,谷歌2017年开发者大会在加州谷歌总部所在地举办.本次会议当中,最重要产品之一即新一代Android O操作系统(也就是我们所说Android 8.0)成为最大的亮点.最新发布的A ...

  2. android仿钉钉日程日历,Flutter仿钉钉考勤日历的示例代码

    本文主要介绍了Flutter仿钉钉考勤日历的示例代码,分享给大家,具体如下: 效果 原型 开发 1. 使用 // 考勤日历 DatePickerDialog( initialDate: DateTim ...

  3. Android 8 禁止 谷歌,谷歌Android8.0增降级保护功能:升级后不能降级

    [PConline资讯]一直以来,每当新版iOS系统发布,就意味着苹果即将关闭上一个iOS版本的验证通道,而升级到新版iOS系统的用户将无法降回原来的系统.现在, 谷歌Android系统似乎也要学苹果 ...

  4. 一加连续点Android版本号,一加5T Android8.0全国首刷/附加教程和ROM

    一加5T作为全面屏大军的一员,总算在11月和我们见面了,果核也在第一时间下单买到了一加5T,到手了第一件事就是刷机. 其实果核最早就有一台一加3,在出手没多久就看到了一加3刷安卓8.0的消息,当时那个 ...

  5. android7.0后台,安卓7.0带来一键清理后台 真能使手机变快吗

    原标题:安卓7.0带来一键清理后台 真能使手机变快吗 从这个月开始手机扎堆发布,苹果.三星和LG这些国际大厂都带来了自己的年度旗舰产品,手机界可谓是热闹非凡.于是站安卓党和站ios党就到底哪家手机更好 ...

  6. android java加密_Android、iOS和Java通用的AES128加密解密示例代码

    前言 移动端越来越火了,我们在开发过程中,总会碰到要和移动端打交道的场景,比如android和iOS的打交道.为了让数据交互更安全,我们需要对数据进行加密传输. 这篇文章给大家分享AES的加密和解密. ...

  7. android自定义push通知_android通过自定义toast实现悬浮通知效果的示例代码

    android通过toast实现悬浮通知效果,如图: 实现的功能: 自定义悬浮弹窗: 点击其他地方该布局不受影响: 可自定义显示时间: 可以设置点击事件: 代码如下: import android.c ...

  8. android 模拟器 vscode,解决夜神模拟器启动后 VSCode仍然No Device问题(示例代码)

    1.搜索cmd进入终端: 2.cd进入夜神模拟器安装处的bin目录下,如:D:Noxin: 3.执行命令:nox_adb.exe connect 127.0.0.1:62001. 再次打开vscode ...

  9. [导入]Asp.net 2.0 自定义控件开发[实现自动计算功能(AutoComputeControl)][示例代码下载]...

    Asp.net 2.0 自定义控件开发[实现自动计算功能(AutoComputeControl)][重点推荐控件][示例代码下载] 文章来源:http://blog.csdn.net/chengkin ...

最新文章

  1. 电脑连接电视方法详解_查看电脑配置的几种方法(图文详解)
  2. hbase shell 命令行从入门到放弃
  3. 深度学习之Image captioning的评分指标篇(BLEU、CIDEr)
  4. java-银行业务调度系统《十一》
  5. liunx 命令 之 mkdir 与 touch
  6. Hyperledger Fabric教程(14)--动态添加组织的步骤
  7. VMware卸载Ubuntu系统(详细教程)
  8. 无法安装程序包“xxx”。你正在尝试将此程序包安装到目标为“.NETFramework,Version=v4.5”的项目中
  9. linux 桌面对比,七大顶级Linux桌面比较
  10. python跳一跳编程构造_Python玩“跳一跳” iOS+Win 硬件实现
  11. 错误: 找不到或无法加载主类 org.sang.BlogserverApplication
  12. 简单实现微信小程序音乐音频播放的功能
  13. PMP证书容易考吗?
  14. HTTP/2协议详细介绍
  15. 【程序人生】Java这么卷,你为什么还在坚持?热爱吗?因为穷
  16. Oracle 12c 读书笔记——筑梦之路
  17. TI杯 LaunchPad MSP430开发环境搭建
  18. android crash存储位置,在Android手机上保存Crash Log
  19. 百度地图离线webjs pc端研究 附文件下载
  20. 享誉 C++《圣经》和《神书》之美名的三部巨著.PDF(最完美版)

热门文章

  1. 使用机器学习进行客户终身价值和RFM模型分析
  2. 详解C/C++中的的:#pragma pack(push) 、#pragma pack(pop) 和#pragma pack()
  3. 0-1背包问题C语言
  4. onenet数据实时更新到mysql_使用注意
  5. 通过短信网关发送Wappush(包括超长Wappush)
  6. 华为HCIE学习备份笔记
  7. android studio小日常(持续更新)
  8. 视频虚拟剪辑工具_VirtualClip
  9. 机器人学导论笔记(二)
  10. 程序基本算法习题解析 设计一个算法,计算男女运动员最佳配对方案,使各组男女双方竞赛优势的总和达到最大。