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

标签:Android8.0,适配
0
投稿

猜你喜欢

  • base64_encode和base64_decode的JAVA实现

    2023-08-25 07:56:49
  • 一文看懂JAVA设计模式之工厂模式

    2023-11-27 02:30:54
  • clion最新激活码+汉化的步骤详解(亲测可用激活到2089)

    2023-07-17 08:03:53
  • unity实现翻页效果

    2022-09-01 17:10:15
  • C#利用System.Threading.Thread.Sleep即时输出信息的详解

    2021-07-08 02:35:15
  • Android AIDL实现与服务相互调用方式

    2021-08-09 10:57:40
  • C#中datatable序列化与反序列化实例分析

    2021-10-13 10:53:06
  • Lombok 的@StandardException注解解析

    2022-09-16 23:37:19
  • C#控制台程序如何发布到服务器Linux上运行

    2022-07-17 05:57:52
  • File.createTempFile创建临时文件的示例详解

    2022-05-03 08:52:41
  • 浅谈Maven镜像更换为阿里云中央仓库(精)

    2022-08-06 04:48:17
  • Android中GPS坐标转换为高德地图坐标详解

    2023-10-07 20:40:24
  • java如何获取map中value的最大值

    2023-04-11 05:12:04
  • 基于Java ActiveMQ的实例讲解

    2023-08-24 08:39:38
  • java private关键字用法实例

    2022-01-16 10:08:06
  • Android实现启动页倒计时效果

    2021-07-26 20:50:14
  • Android xUtils更新到3.0后的基本使用规则详解

    2023-02-07 23:14:39
  • C#如何Task执行任务,等待任务完成

    2022-03-06 11:31:31
  • Android开发中Intent.Action各种常见的作用汇总

    2022-10-08 10:24:53
  • Java struts2捕获404错误的方法汇总

    2021-10-14 00:12:16
  • asp之家 软件编程 m.aspxhome.com