美文网首页Android技术知识Android开发Android开发
Android8.0适配前台定位服务service

Android8.0适配前台定位服务service

作者: hongjay | 来源:发表于2018-07-17 11:19 被阅读2次

从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) {
       }
   };

  1. 我在onBind()方法中调用了startForeground(int, Notification)
    第一个参数是一个不为0的正整数,代表通知的id,第二个参数代表需要显示的通知。
    适配8.0的通知构建需要适配,不然会导致你的通知无法显示(第一次调用的时候还以为是一加拦截了通知)

  2. 那么这时候应该已经实现了前台服务,需要把服务获得的位置信息传递给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;
   }
  1. 然后需要进行控件和服务的交互,这里就分成了三种方法
  • 在得到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://blog.csdn.net/xiaanming/article/details/9750689

相关文章

  • Android8.0适配前台定位服务service

    从Android 8.0开始系统为实现降低功耗,对后台应用获取用户位置信息频率进行了限制,每小时只允许更新几次位置...

  • android熄屏或退回后台持续定位方法

    一、根据android8.0的官方api说明 如果需要高频率定位,且用户正在与其他应用交互,需要使用前台服务,具体...

  • 适配iOS11

    1.定位适配 如果希望在app在前台后台都可以使用定位服务,需要完成以下几点: 1,在plist中增加NSLoca...

  • Service的简单使用

    前言 文本主要介绍Service的简单使用,了解Service的各种服务(前台服务,后台服务(本地服务,远程服务)...

  • Service详解_其他知识

    本篇内容主要讲解其他关于Service内容: 前台服务以及通知发送 服务Service与线程Thread的区别 A...

  • Android8.0 Service的适配框架

    安卓8.0对后台服务的限制 关于安卓8.0对后台服务限制的介绍,详情可以查看以下文章: Android 8.0 +...

  • Android启动Service系统适配演进

    Android8.0 后台服务限制:处于空闲状态时,应用可以使用的后台服务存在限制。 这些限制不适用于前台服务,因...

  • Web server 和 Web Service

    前台接待(sever, Nginx ) 与 真正的价值服务者(service, cgi后...

  • Android基础知识:Service(4)更多知识

    废话 今天我们来学习下关于Service的更多知识 前台服务 IntentService 在Service中启动A...

  • 安卓开发service永久运行

    想service永久运行我们可以在service里播放无声音乐或者使用前台服务,但是单单做这些service还是无...

网友评论

    本文标题:Android8.0适配前台定位服务service

    本文链接:https://www.haomeiwen.com/subject/yaewpftx.html