示例中心
功能在线体验
控制台

应用后台持续定位

该示例向您展示如何App切换到后台后长时间保持持续定位。
00:00 / 01:00
扫描二维码在手机端体验功能
体验移动端 扫码体验移动端

使用场景

该示例主要展示App切换到后台熄灭屏幕后如何持续获得设备位置。

用到产品

Android 定位 SDK

核心类/接口

接口

说明

版本

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();
    //释放
}

 

00:00 / 01:00
扫描二维码在手机端体验功能
体验移动端 扫码体验移动端

使用场景

该示例主要展示App切换到后台后如何持续获得设备位置。

用到产品

iOS 定位 SDK

核心类/接口

接口

说明

版本

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)
}