Android 8.0权限说明 最后更新时间: 2021年01月22日
从Android 8.0开始系统为实现降低功耗,对后台应用获取用户位置信息频率进行了限制,每小时只允许更新几次位置信息,详细信息请参考官方说明。按照官方指引,如果要提高位置更新频率,需要后台应用提供一个前台服务通知告知。如果您需要自己参考官方指引来完成设置,可以参考之前我们提供的github示例。
从定位SDK v3.8.0版本开始,我们将这一操作封装到了定位SDK中,您在使用过程中只需要调用一个接口就可以为您的应用创建一个前台服务通知,当您的应用切换到后台后仍然有一个前台服务通知存在,以此规避Android 8.0对后台定位的限制。这部分内容将对这一功能进行介绍。
第一步,创建一个通知栏
您需要创建一个通知栏,下面的代码是一个简单示例,具体请您根据自己的业务进行相关修改。
private static final String NOTIFICATION_CHANNEL_NAME = "BackgroundLocation";
private NotificationManager notificationManager = null;
boolean isCreateChannel = false;
@SuppressLint("NewApi")
private Notification buildNotification() {
Notification.Builder builder = null;
Notification notification = null;
if(android.os.Build.VERSION.SDK_INT >= 26) {
//Android O上对Notification进行了修改,如果设置的targetSDKVersion>=26建议使用此种方式创建通知栏
if (null == notificationManager) {
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(Utils.getAppName(this))
.setContentText("正在后台运行")
.setWhen(System.currentTimeMillis());
if (android.os.Build.VERSION.SDK_INT >= 16) {
notification = builder.build();
} else {
return builder.getNotification();
}
return notification;
}
第二步,设置当调用后台定位接口时,显示通知栏
在您的应用切到后台或者您需要显示前台通知的时候调用后台定位接口,显示前台服务通知栏。
//启动后台定位,第一个参数为通知栏ID,建议整个APP使用一个
locationClient.enableBackgroundLocation(2001, buildNotification());
第三步,关闭后台定位以及通知栏
当您不再需要通知栏时,请调用关闭后台定位接口
//关闭后台定位,参数为true时会移除通知栏,为false时不会移除通知栏,但是可以手动移除
locationClient.disableBackgroundLocation(true);
注意事项
1、如果您的应用在切到后台时已经存在前台服务通知了,则不需再调用这个接口;
2、建议您在整个应用中只有一个AMapLocationClient调用enableBackgroundLocation和disableBackgroundLocation接口即可,但存在多个AMapLocationClient且都调用了enableBackgroundLocation接口则需要所有的AMapLocationClient都调用了disableBackgroundLocation(true)接口通知栏才会移除;
3、开启关闭后台定位接口只是提供一个前台服务通知栏并不具备开始、停止定位的功能,开启、停止定位请调用AMapLocationCLient的startLocation()和stopLocation()接口