该示例主要展示App切换到后台后如何持续获得设备位置。
核心类/接口
类 | 接口 | 说明 | 版本 |
---|---|---|---|
AMapLocationManager | setPausesLocationUpdatesAutomatically:NO | 保持后台定位不被系统挂起 | V1.0.0版本起 |
setAllowsBackgroundLocationUpdates:YES | iOS 9以上设置 | V1.0.0版本起 | |
startUpdatingLocation | 启动定位 | V1.0.0版本起 | |
mapLocationManager:(MALocationManager *)manager didUpdateLocation:(CLLocation *)location | 定位结果回调函数 | V1.0.0版本起 |
1、必要的配置工作:
包含配置 info.plist文件内容,在Capabilities中配置开启后台定位。
2、必要的代码设置:
首先需要设置如下代码段,确保后台运行定位时定位线程不被 iOS 系统挂起:
//设置允许后台定位参数,保持不会被系统挂起
[self.locationManager setPausesLocationUpdatesAutomatically:NO];
//iOS9(含)以上系统需设置
[self.locationManager setAllowsBackgroundLocationUpdates:YES];
/* 设置后台定位. */
locationManager = AMapLocationManager()
locationManager.delegate = self
locationManager.pausesLocationUpdatesAutomatically = false
locationManager.allowsBackgroundLocationUpdates = true
locationManager.locatingWithReGeocode = true
之后开启持续定位功能:
//开始持续定位
[self.locationManager startUpdatingLocation];
//开始进行连续定位
locationManager.startUpdatingLocation()
最后接收定位结果回调:
- (void)amapLocationManager:(MALocationManager *)manager didUpdateLocation:(CLLocation *)location{
NSLog(@"location:{lat:%f; lon:%f; accuracy:%f}", location.coordinate.latitude, location.coordinate.longitude, location.horizontalAccuracy);
//业务处理
}
func amapLocationManager(_ manager: AMapLocationManager!, didUpdate location: CLLocation!, reGeocode: AMapLocationReGeocode!) {
print("Location:\(location)")
self.locateCount += 1
updateLabelWithLocation(location, regeocode: reGeocode)
}
该示例主要展示App切换到后台熄灭屏幕后如何持续获得设备位置。
核心类/接口
类 | 接口 | 说明 | 版本 |
---|---|---|---|
AMapLocationClient | startLocation(); | 启动定位 | V2.0.0版本起 |
setLocationOption(mLocationOption); | 给定位客户端设置参数 | V2.0.0版本起 | |
AMapLocationClientOption | setInterval(long time); | 设置连续定位时间间隔 | V2.0.0版本起 |
AMapLocationListener | onLocationChanged(AMapLocation amapLocation) ; | 监听器回调方法 | V2.0.0版本起 |
首先在本地服务中启动连续定位功能,通过设置一个Alarm定期对本地服务进行周期唤起,从而达到后台持续定位的效果。
1、在本地服务里启动连续定位:
//在activity中启动自定义本地服务LocationService
getApplicationContext().startService(new Intent(this, LocationService.class));
//在LocationService中启动定位
mLocationClient = new AMapLocationClient(this.getApplicationContext());
mLocationOption = new AMapLocationClientOption();
// 使用连续定位
mLocationOption.setOnceLocation(false);
// 每10秒定位一次
mLocationOption.setInterval(10 * 1000);
mLocationClient.setLocationOption(mLocationOption);
mLocationClient.setLocationListener(locationListener);
mLocationClient.startLocation();
2、创建并启动Alarm。
//创建Alarm并启动
Intent intent = new Intent("LOCATION_CLOCK");
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
// 每十五秒唤醒一次
long second = 15 * 1000;
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), second, pendingIntent);
3、通过Alarm启动本地服务,如果定位停止,在服务中再次启动。
public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals("LOCATION_CLOCK")) {
Log.e("ggb", "--->>> onReceive LOCATION_CLOCK");
Intent locationIntent = new Intent(context, LocationService.class);
context.startService(locationIntent);
}
}
}
然后,定期在CPU休眠之前进行屏幕点亮操作。这个操作会导致cpu无法休眠耗电量增加,请谨慎使用。
if (powerManager == null) {
//针对熄屏后cpu休眠导致的无法联网、定位失败问题,通过定期点亮屏幕实现联网,本操作会导致cpu无法休眠耗电量增加,谨慎使用
powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl=powerManager
.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP |PowerManager.SCREEN_DIM_WAKE_LOCK, "bright");
wl.acquire();
//点亮屏幕
wl.release();
//释放
}