Android8.0适配前台定位服务service的示例代码

 更新时间:2018年07月17日 14:50:15   作者:hongjay  
这篇文章主要介绍了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发送同样的消息的话,用这种方法就更好,这里就省略不写了。具体可以参考下面的文章。

参考文章:https://www.jb51.net/article/123316.htm

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

相关文章

  • 深入Android SQLite 事务处理详解

    深入Android SQLite 事务处理详解

    本篇文章是对Android中SQLite 事务处理进行了详细的分析介绍。需要的朋友参考下
    2013-05-05
  • Android编程之页面切换测试实例

    Android编程之页面切换测试实例

    这篇文章主要介绍了Android编程之页面切换测试,实例分析了Android实现页面点击切换的相关技巧,非常具有实用价值,需要的朋友可以参考下
    2015-04-04
  • Android Studio获取网络JSON数据并处理的方法

    Android Studio获取网络JSON数据并处理的方法

    这篇文章主要为大家详细介绍了Android Studio获取网络JSON数据并处理的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • Android开发实现的简单媒体播放器功能示例

    Android开发实现的简单媒体播放器功能示例

    这篇文章主要介绍了Android开发实现的简单媒体播放器功能,结合实例形式分析了Android基于surfaceview实现多媒体视频及音频播放的相关操作技巧,需要的朋友可以参考下
    2017-10-10
  • Android基于注解的6.0权限动态请求框架详解

    Android基于注解的6.0权限动态请求框架详解

    这篇文章主要介绍了Android基于注解的6.0权限动态请求框架详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • 代码分析Android消息机制

    代码分析Android消息机制

    本文通过代码实例详细分析了Android消息机制的相关知识点,对此有需要的朋友可以参考学习下。
    2018-03-03
  • Android获取双卡双待手机的SIM卡信息示例代码

    Android获取双卡双待手机的SIM卡信息示例代码

    这篇文章主要给大家介绍了关于Android获取双卡双待手机的SIM卡信息的相关资料,文中通过示例代码介绍的非常详细,对各位Android开发者们具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-11-11
  • Flutter实现视频压缩功能的示例代码

    Flutter实现视频压缩功能的示例代码

    移动应用程序中,视频占用了大量的存储空间和带宽,这在一定程度上影响了应用程序的性能和用户体验,所以本文为大家准备了Flutter实现视频压缩的方法,需要的可以参考一下
    2023-06-06
  • Android应用开发中自定义ViewGroup视图容器的教程

    Android应用开发中自定义ViewGroup视图容器的教程

    这篇文章主要介绍了Android应用开发中自定义ViewGroup视图容器的教程,重点在于View之间的参数传递,文中还讲到了使用ViewDragHelper自定义ViewGroup的方法,需要的朋友可以参考下
    2016-04-04
  • Android实现带页面切换的锁屏功能

    Android实现带页面切换的锁屏功能

    这篇文章主要为大家详细介绍了Android实现带页面切换的锁屏功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-06-06

最新评论