android8.0定位功能,Android8.0适配前台定位服务service的示例代码-程序员宅基地

技术标签: android8.0定位功能  

从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发送同样的消息的话,用这种方法就更好,这里就省略不写了。具体可以参考下面的文章。

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_31417135/article/details/117312867

智能推荐

html怎么添加文本内容吗,添加文本内容.html-程序员宅基地

文章浏览阅读948次。添加文本内容$axure.utils.getTransparentGifPath = function() { return 'resources/images/transparent.gif'; };$axure.utils.getOtherPath = function() { return 'resources/Other.html'; };$axure.utils.getReloadPa..._html中function添加文字

eclipse提示SyntaxError: Non-UTF-8 code starting with '\xc4' in file C:\Users\ 怎么解决_syntaxerror: non-utf-8 code starting with '\xc8' i-程序员宅基地

文章浏览阅读9.9k次,点赞2次,收藏9次。一、第一种方法首行增加,已测试可用。# coding=gbk程序中出现中文,运行的时候出现如下错误:SyntaxError: Non-UTF-8 code starting with 'xc1' in file C:...xxx.py on line 8, but no encoding declared; see http://python.org/dev/peps/pep-0263/ _syntaxerror: non-utf-8 code starting with '\xc8' in file c:\users\26743\desk

JAVA笔试代码找错_京东笔试括号匹配问题(代码找错)-程序员宅基地

文章浏览阅读111次。这一题,测试了好几种情况都通过了,例如:())(;((()));)))(((;(())));但是提交只能通过10%,我现在陷入死角了,求各位大佬帮忙;我这一题的思路是,遍历一遍字符串,假如最后结果栈中只有")("那么就判断一次交换可以成功,其他情况都不成功import java.util.Scanner;import java.util.Stack;/*** @Author: Taoyongpan..._笔试代码找错

pandas小记:pandas时间序列分析和处理Timeseries_x must be a pandas object-程序员宅基地

文章浏览阅读10w+次,点赞13次,收藏102次。http://blog.csdn.net/pipisorry/article/details/52209377pandas 最基本的时间序列类型就是以时间戳(TimeStamp)为 index 元素的 Series 类型。其它时间序列处理相关的包[P4J 0.6: Periodic light curve analysis tools based on Information Theory][p4_x must be a pandas object

vue中在哪个生命周期中dom被渲染_Vue.js 组件的生命周期-程序员宅基地

文章浏览阅读2.5k次。本文目录结构问题Vue组件的生命周期答案总共分为8个阶段创建前/后,载⼊前/后,更新前/后,销毁前/后创建前/后: 在 beforeCreate 阶段, vue 实例的挂载元素 el 和数据对象 data 都为undefined ,还未初始化。在 created 阶段, vue 实例的数据对象 data 有了,el还 没有载⼊前/后:在 beforeMount 阶段, vue 实例的 $el 和 ..._vue渲染dom是在哪个环节

服务器ubuntu18.04安装虚拟机并安装centos6.8系统---3(虚拟机安装centos6.8系统)_ubuntu18.4对应centos那个版本-程序员宅基地

文章浏览阅读1.2k次。前两篇在服务器上把远程界面和虚拟机都安装好了后,现在进入第一小节,安装操作系统,这里要安装的是centos6.8。 1、下载安装系统。 进入CentOS官方网站 https://www.centos.org,找到要下载的系统下载,怎么下载,这个网上有很多资料,就不赘述了,我本地网很慢,依然在服务器上下载了wget http://archive.kernel.org/centos-vau..._ubuntu18.4对应centos那个版本

随便推点

通用技术计算机辅助设计教案,高一通用技术课堂《设计的一般过程》的优秀教案...-程序员宅基地

文章浏览阅读263次。高一通用技术课堂《设计的一般过程》的优秀教案教学过程1. 引入新课多媒体投影展示几个新颖的设计,这些作品基于什么目的而设计的,它解决了什么问题?师:这些作品是怎么来的呢?生:设计出来的。师:我们要知道完成任何一件事情都有一个过程,须遵循一定的步骤,设计也不例外。通过前面的学习,我们已经知道,技术世界因设计而愈加精彩,设计是技术发展的关键。我们设计的最终目的是什么?就是为了解决人们的实际需要。那么同..._高一计算机技术与通用教案

POJ-3415-Common-Substring-后缀数组-并查集_并查集 poj 3415-程序员宅基地

文章浏览阅读172次。题目题目链接内容给两个字符串a,ba,ba,b ,和整数kkk 询问a,ba,ba,b的公共子串中长度大于等于kkk的个数分析对于一个长度为len(len>=k)len(len>=k)len(len>=k) 的公共子串,它对答案的贡献为len−k+1len-k+1len−k+1 ,我们构建后缀数组,将heightheightheight 数组排序,从大到小遍历hei..._并查集 poj 3415

linux脚本while死循环,shell编程之while死循环-程序员宅基地

文章浏览阅读2.5k次。在linux下编程的程序猿都知道shell脚本,就算你不怎么熟悉,也应该听过的吧!那在shell脚本中的死循环该怎么写呢?对于熟悉C语言的猿人们来说,最简单的死循环应该这样写:-------------------------------------------------------------------------while(1){//do something}---------------..._写一个死循环while(1)

成功人士的名言精选——看看你的名言是哪一句?你做到了吗?_brian tracy 名言-程序员宅基地

文章浏览阅读1k次。毋庸置疑,每个人都有自己的名言警句,因为有目标、因为有理想,我们都在拼命努地奋斗着、拼搏着,希望你的名言可以让你距离成功更进一步,相信自己! 1. Success is never a destination, it is a journey.—— Statenig St. Marie  成功不是终点,而是旅程。—— 斯塔特尼格·圣·玛_brian tracy 名言

python程序编译之后、找不到生成的pyc文件_浅谈python编译pyc工程--导包问题解决...-程序员宅基地

文章浏览阅读521次。利用python 编译工程,生产pyc文件pyc文件好处:是一种二进制机器码,并且隐藏了源文件代码,但是有和py文件一样的功能(可以理解为效果一样)所以可以将代码隐藏,便于商业价值,保护代码隐私还能和py文件一样可运行import compileallcompileall.compile_dir(r'/path')所以在一些情况下,需将源文件工程批量生成pyc文件来隐藏代码。上面代码即为 批量生成..._python 没有py文件调用pyc文件失败

抛弃格子衫和冲锋衣,程序员该如何穿?-程序员宅基地

文章浏览阅读111次。在众多人眼中,程序猿是最不会穿衣搭配的物种了,他们一年四季的标配就是格子衫加牛仔裤,冷的时候再加件冲锋衣。每到春夏,码农的大花格子衬衫就会在互联网公司的格子间遍地开花,如同冲锋衣是秋冬标配一样,格子衬衫就是程序员的夏季制服,一堆程序员在一起都不是连连看。人靠衣装,佛靠金装”这句话很多人都听过,但是放在心上的未必有几个,对于不善于穿衣打扮的程...序...员...来说,更是如此。根据聚能...