后台定位

当用户进程出于后台时,有时也会有需求使用定位服务,但应用处于后台时Android系统会对定位做诸多限制。因此我们通过设置前台Service的方式来提高进程级别,使定位服务由后台转向前台。

注意:如果您的应用已经存在前台服务,或者有其它任何手段可以保证进程一直处于前台,那么不需要使用我们提供的后台定位方案。


 1.manifest增加Service声明

   <service
      android:name="com.tencent.map.geolocation.s"
      android:foregroundServiceType="location"/>

 2.在启动定位之前,调用enableForegroundLocation,如下:

mLocationManager.enableForegroundLocation(LOC_NOTIFICATIONID, buildNotification());
mLocationManager.requestLocationUpdates(request, this, getMainLooper());

构建Notification

private Notification buildNotification() {
    Notification.Builder builder = null;
    Notification notification = null;
    if (android.os.Build.VERSION.SDK_INT >= 26) {
        //Android O上对Notification进行了修改,如果设置的targetSDKVersion>=26建议使用此种方式创建通知栏
        if (notificationManager == null) {
            notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        }
        String channelId = getPackageName();
        if (!isCreateChannel) {NotificationChannel notificationChannel = new NotificationChannel(channelId,
                    NOTIFICATION_CHANNEL_NAME, NotificationManager.IMPORTANCE_DEFAULT);
            notificationChannel.enableLights(true);//是否在桌面icon右上角展示小圆点
            notificationChannel.setLightColor(Color.BLUE); //小圆点颜色
            notificationChannel.setShowBadge(true); //是否在久按桌面图标时显示此渠道的通知
            notificationManager.createNotificationChannel(notificationChannel);
            isCreateChannel = true;
        }
        builder = new Notification.Builder(getApplicationContext(), channelId);
    } else {
        builder = new Notification.Builder(getApplicationContext());
    }
    builder.setSmallIcon(R.drawable.ic_launcher)
            .setContentTitle("LocationDemo")
            .setContentText("正在后台运行")
            .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher))
            .setWhen(System.currentTimeMillis());

    if (android.os.Build.VERSION.SDK_INT >= 16) {
        notification = builder.build();
    } else {
        notification = builder.getNotification();
    }
    return notification;
}

其中enableForegroundLocation的参数分别是一个整形的NotificationID,一个是Notification的实例。具体API说明可以查看参考手册。使用范例可以查看示例代码。


 3.在停止定位之后,调用disableForegroundLocation停止前台服务,如下:

LocationManager.removeUpdates(this);
mLocationManager.disableForegroundLocation(true);

这篇文章对您解决问题是否有帮助?

已解决
未解决