android 8.0后台定位,Android8.0适配前台定位服务service的示例代码
从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的示例代码相关推荐
- android7虚拟定位,Android8.0还早 EMUI助推Android7.0普及
5月17日至19日,谷歌2017年开发者大会在加州谷歌总部所在地举办.本次会议当中,最重要产品之一即新一代Android O操作系统(也就是我们所说Android 8.0)成为最大的亮点.最新发布的A ...
- android仿钉钉日程日历,Flutter仿钉钉考勤日历的示例代码
本文主要介绍了Flutter仿钉钉考勤日历的示例代码,分享给大家,具体如下: 效果 原型 开发 1. 使用 // 考勤日历 DatePickerDialog( initialDate: DateTim ...
- Android 8 禁止 谷歌,谷歌Android8.0增降级保护功能:升级后不能降级
[PConline资讯]一直以来,每当新版iOS系统发布,就意味着苹果即将关闭上一个iOS版本的验证通道,而升级到新版iOS系统的用户将无法降回原来的系统.现在, 谷歌Android系统似乎也要学苹果 ...
- 一加连续点Android版本号,一加5T Android8.0全国首刷/附加教程和ROM
一加5T作为全面屏大军的一员,总算在11月和我们见面了,果核也在第一时间下单买到了一加5T,到手了第一件事就是刷机. 其实果核最早就有一台一加3,在出手没多久就看到了一加3刷安卓8.0的消息,当时那个 ...
- android7.0后台,安卓7.0带来一键清理后台 真能使手机变快吗
原标题:安卓7.0带来一键清理后台 真能使手机变快吗 从这个月开始手机扎堆发布,苹果.三星和LG这些国际大厂都带来了自己的年度旗舰产品,手机界可谓是热闹非凡.于是站安卓党和站ios党就到底哪家手机更好 ...
- android java加密_Android、iOS和Java通用的AES128加密解密示例代码
前言 移动端越来越火了,我们在开发过程中,总会碰到要和移动端打交道的场景,比如android和iOS的打交道.为了让数据交互更安全,我们需要对数据进行加密传输. 这篇文章给大家分享AES的加密和解密. ...
- android自定义push通知_android通过自定义toast实现悬浮通知效果的示例代码
android通过toast实现悬浮通知效果,如图: 实现的功能: 自定义悬浮弹窗: 点击其他地方该布局不受影响: 可自定义显示时间: 可以设置点击事件: 代码如下: import android.c ...
- android 模拟器 vscode,解决夜神模拟器启动后 VSCode仍然No Device问题(示例代码)
1.搜索cmd进入终端: 2.cd进入夜神模拟器安装处的bin目录下,如:D:Noxin: 3.执行命令:nox_adb.exe connect 127.0.0.1:62001. 再次打开vscode ...
- [导入]Asp.net 2.0 自定义控件开发[实现自动计算功能(AutoComputeControl)][示例代码下载]...
Asp.net 2.0 自定义控件开发[实现自动计算功能(AutoComputeControl)][重点推荐控件][示例代码下载] 文章来源:http://blog.csdn.net/chengkin ...
最新文章
- 电脑连接电视方法详解_查看电脑配置的几种方法(图文详解)
- hbase shell 命令行从入门到放弃
- 深度学习之Image captioning的评分指标篇(BLEU、CIDEr)
- java-银行业务调度系统《十一》
- liunx 命令 之 mkdir 与 touch
- Hyperledger Fabric教程(14)--动态添加组织的步骤
- VMware卸载Ubuntu系统(详细教程)
- 无法安装程序包“xxx”。你正在尝试将此程序包安装到目标为“.NETFramework,Version=v4.5”的项目中
- linux 桌面对比,七大顶级Linux桌面比较
- python跳一跳编程构造_Python玩“跳一跳” iOS+Win 硬件实现
- 错误: 找不到或无法加载主类 org.sang.BlogserverApplication
- 简单实现微信小程序音乐音频播放的功能
- PMP证书容易考吗?
- HTTP/2协议详细介绍
- 【程序人生】Java这么卷,你为什么还在坚持?热爱吗?因为穷
- Oracle 12c 读书笔记——筑梦之路
- TI杯 LaunchPad MSP430开发环境搭建
- android crash存储位置,在Android手机上保存Crash Log
- 百度地图离线webjs pc端研究 附文件下载
- 享誉 C++《圣经》和《神书》之美名的三部巨著.PDF(最完美版)
热门文章
- 使用机器学习进行客户终身价值和RFM模型分析
- 详解C/C++中的的:#pragma pack(push) 、#pragma pack(pop) 和#pragma pack()
- 0-1背包问题C语言
- onenet数据实时更新到mysql_使用注意
- 通过短信网关发送Wappush(包括超长Wappush)
- 华为HCIE学习备份笔记
- android studio小日常(持续更新)
- 视频虚拟剪辑工具_VirtualClip
- 机器人学导论笔记(二)
- 程序基本算法习题解析 设计一个算法,计算男女运动员最佳配对方案,使各组男女双方竞赛优势的总和达到最大。