优化思路:
将定位逻辑写在Application中,并提供监听,需要时在其他Activity中调用结果。
解决问题:
1.将定位逻辑写在Activity可能存在定位多次初始化、多次请求定位等定位相关逻辑混乱的问题;
2.定位逻辑初始化时的定位设置耗时较多,写在Activity中会导致Activity启动过慢的问题。
基本配置:
见高德配置文档。
具体实现:
源代码:
package com.example.xxx;
import android.app.Application;
import android.content.Context;
import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationClient;
import com.amap.api.location.AMapLocationClientOption;
import com.amap.api.location.AMapLocationClientOption.AMapLocationMode;
import com.amap.api.location.AMapLocationListener;
public class App extends Application {
// 声明AMapLocationClient类对象
public static AMapLocationClient mLocationClient = null;
// 声明AMapLocationClientOption对象
public static AMapLocationClientOption mLocationOption = null;
public static AMapLocation mLoction = null;
public static Context mContext;
@Override
public void onCreate() {
super.onCreate();
mContext = this;
}
/**
*
* @ClassName: MyLocationListener
* @Description: 定位回调
* @author frank.fun@qq.com
* @date 2016年11月10日 下午2:05:45
*
*/
public interface MyLocationListener {
public void onLocationChanged(AMapLocation location);
}
/**
*
* @Title: getLocation
* @Description: 获取当前地址,不重新获取
* @param listener
*/
public static void getLocation(final MyLocationListener listener) {
if (mLoction != null) {
listener.onLocationChanged(mLoction);
return;
}
getCurrentLocation(listener);
}
/**
*
* @Title: getCurrentLocation
* @Description: 重新获取当前地址
* @param listener
*/
public static void getCurrentLocation(final MyLocationListener listener) {
// 初始化定位
mLocationClient = new AMapLocationClient(mContext);
// 设置定位回调监听
mLocationClient.setLocationListener(new AMapLocationListener() {
@Override
public void onLocationChanged(AMapLocation location) {
if (location != null) {
mLocationClient.stopLocation();
mLoction = location;
listener.onLocationChanged(location);
}
}
});
// 初始化AMapLocationClientOption对象
mLocationOption = new AMapLocationClientOption();
// 设置定位模式为AMapLocationMode.Hight_Accuracy,高精度模式。
mLocationOption.setLocationMode(AMapLocationMode.Hight_Accuracy);
// 获取最近3s内精度最高的一次定位结果:
// 设置setOnceLocationLatest(boolean
// b)接口为true,启动定位时SDK会返回最近3s内精度最高的一次定位结果。如果设置其为true,setOnceLocation(boolean
// b)接口也会被设置为true,反之不会,默认为false。
mLocationOption.setOnceLocationLatest(true);
// 给定位客户端对象设置定位参数
mLocationClient.setLocationOption(mLocationOption);
// 启动定位
mLocationClient.startLocation();
}
}
在Activity中调用:
App.getLocation(new MyLocationListener() {
@Override
public void onLocationChanged(AMapLocation location) {
location_tv.setText(location.getCity());
}
});
这样,与定位相关的其他需求如经纬度、详细地址等相关逻辑都可以通过此处一个App.getLocation(listener...)中调用获取。