后台定位
当用户进程出于后台时,有时也会有需求使用定位服务,但应用处于后台时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);
这篇文章对您解决问题是否有帮助?
已解决
未解决