Android8.0适配前台定位服务service的示例代码
作者:hongjay 发布时间:2021-05-25 17:18:36
从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发送同样的消息的话,用这种方法就更好,这里就省略不写了。具体可以参考下面的文章。
参考文章:https://www.jb51.net/article/123316.htm
来源:https://www.jianshu.com/p/be23385f5e22


猜你喜欢
- 在service层注入mapper时报空指针今天又遇到一个极其刁钻的问题,废话不多说先上代码,测试单元@RunWith(SpringRunn
- 一、Code First 代码优先DbContext可以用于数据库优先,代码优先和模型优先的开发。DbContext主要包含一组非常易于使用
- JavaFx初探一,UI控件的使用,具体内容如下方式一:使用纯代码直接new view控件,这样就不涉及到与fxml文件之间的交互了方式二:
- 前言在项目中为了灵活配置,我们常采用配置文件,常见的配置文件就比如xml和properties,springboot允许使用properti
- 使用NOPI导入Excel文档NOPI版本:2.3.0,依赖于NPOI的SharpZipLib版本:0.86,经测试适用于.net4.0+记
- 本文实例为大家分享了PhotoView实现图片双击放大单击退出的具体代码,供大家参考,具体内容如下实现思路1.复制PhotoView&nbs
- 概述从今天开始, 小白我将带大家开启 Jave 数据结构 & 算法的新篇章.循环队列循环队列 (Circular Queue) 是一
- 一、前言二、案例需求1.编写login.html登录页面,username&password两个输入框2.使用Druid数据库连接池
- 本文实例讲述了Java基于二叉查找树实现排序功能。分享给大家供大家参考,具体如下:/** * 无论排序的对象是什么,都要实现Comparab
- SpringAOP获取方法参数上的注解一、示例① 如下代码,自定义一个参数注解@Test,并将其使用到方法参数上,用于标注需要检验的参数/*
- Spring * 监测每个Controller或方法的执行时长首先写一个类(TestInterceptor)让他继承HandlerInter
- 本文实例为大家分享了flutter实现底部导航栏的具体代码,供大家参考,具体内容如下一.flutter底部导航栏常用组件BottomNavi
- 在学习MyBatis过程中想实现模糊查询,可惜失败了。后来上百度上查了一下,算是解决了。记录一下MyBatis实现模糊查询的几种方式。 数据
- springboot jpa 延迟加载问题在springboot中,在application.properties的配置文件中新增sprin
- 本文实例讲述了Java利用反射自动封装成实体对象的方法。分享给大家供大家参考。具体分析如下:利用此方法的时候需要传递的参数的名称,必须以行号
- 最近经常在机房看同学在玩一个走迷宫的游戏,比较有趣,自己也用java写一个实现随机生成迷宫的算法,其实就是一个图的深度优先遍历算法.基本思想
- 这篇文章主要介绍了MyBatis Mapper接受参数的四种方式代码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考
- 前言最近在做项目的时候,有个需求就是实现自动轮播式的ViewPager,最直观的例子就是知乎日报顶部的ViewPager,它内部有着好几个子
- 本文实例讲述了Android实现在一个activity中添加多个listview的方法。分享给大家供大家参考,具体如下:listview的i
- 什么是 Nacos Config在分布式系统中,由于服务数量巨多,为了方便服务 配置文件统一管理,实时更新,所以需要分布式配置中心组件。Sp