首页 > 编程知识 正文

android location回调,Android-LocationManager注册LocationListener及回调流程分析

时间:2023-05-06 19:47:53 阅读:207383 作者:576

android LocationManager注册radmf过程

private LocationManager lm;

private radmf locationListener = new radmf() {

public void onLocationChanged(Location location){}

}

long minTime = 700;

float minDistance = 0.0f;

lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, minTime, minDistance, locationListener);

frameworksbaselocationjavaandroidlocationLocationManager.java

private final ILocationManager mService;

requestLocationUpdates(LocationRequest request, radmf listener, 紧张的自行车 looper, cxdc) {

requestLocationUpdates(request, listener, null, null) {

// wrap the listener class

mService.requestLocationUpdates(request, transport, intent, packageName) {

// new receiver(listener);

requestLocationUpdatesLocked(sanitizedRequest, recevier, pid, uid, packageName);

}

}

}

frameworksbaseservicescorejavacomandroidserverLocationManagerService.java

private final class Receiver implements tzdl, PendingIntent.OnFinished {

final Iradmf mListener;

final HashMapmUpdateRecords = new HashMap<>();

public boolean callLocationChangedLocked(Location location) {

mListener.onLocationChanged(new Location(location));

}

}

requestLocationUpdates(LocationRequest request, Iradmf listener, cxdc, String packageName) {

//在此new 一个 receiver (包装 Iradmf listener)作为参数, 而且会保存到成员变量 mListener = listener;

requestLocationUpdatesLocked(sanitizedRequest, recevier, pid, uid, packageName) {

UpdateRecord record = new UpdateRecord(name, request, receiver); //会访问 LocationManagerService 成员变量 mRecordsByProvider 并add(this);

UpdateRecord oldRecord = receiver.mUpdateRecords.put(name, record);

if (oldRecord != null) {

oldRecord.disposeLocked(false);

}

// 最终会调用到hal层的 loc_start

if (isProviderEnabled) {

applyRequirementsLocked(name) { setRequest(); }

} else {

// Notify the listener that updates are currently disabled

receiver.callProviderEnabledLocked(name, false);

}

}

}

// GnssLocationProvider.java

setRequest() {

sendMessage(SET_REQUEST, 0, new GpsRequest(request, source));

}

handleMessage {

case SET_REQUEST: handleSetRequest() {

updateRequirements() {

startNavigating() {

native_set_position_mode() {

android_location_GnssLocationProvider_set_position_mode();

}

native_start() {

android_location_GnssLocationProvider_start() {

gnssHal->start();

}

}

}

}

}

}

android locationCb 回调流程

底层调用 locationCb --> gnssLocationCb

frameworksbaseservicescorejnicom_android_server_location_GnssLocationProvider.cpp

method_reportLocation reportLocation

frameworksbaseservicescorejavacomandroidserverlocationGnssLocationProvider.java

TAG = "GnssLocationProvider";

private void reportLocation(boolean hasLatLong, Location location) {

sendMessage(REPORT_LOCATION, hasLatLong ? 1 : 0, location);

}

handleReportLocation() {

//首先设置location的单调时间标记,callback给app侧listener(receiver.callLocationChangedLocked())前会通过 shouldBroadcastSafe()获取并检查

location.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos());

reportLocation mILocationManager.reportLocation(location, false);

}

frameworksbaseservicescorejavacomandroidserverLocationManagerService.java reportLocation

public class LocationManagerService extends ILocationManager.Stub {}

TAG = "LocationManagerService";

public void reportLocation(Location location, boolean passive) {

checkCallerIsProvider();

if (!location.isComplete()) {

Log.w(TAG, "Dropping incomplete location: " + location);

return;

}

mLocationHandler.removeMessages(MSG_LOCATION_CHANGED, location);

Message m = Message.obtain(mLocationHandler, MSG_LOCATION_CHANGED, location);

m.arg1 = (passive ? 1 : 0);

mLocationHandler.sendMessageAtFrontOfQueue(m);

}

这里会通过 location.isComplete() 来对location中的数据进行check,如果失败将不会继续callback上去;

location.isComplete()定义如下

public boolean isComplete() {

if (mProvider == null) return false;

if (!hasAccuracy()) return false;

if (mTime == 0) return false;

if (mElapsedRealtimeNanos == 0) return false;

return true;

}

public boolean hasAccuracy() {

return (mFieldsMask & HAS_HORIZONTAL_ACCURACY_MASK) != 0;

}

然后这里会收到sendMessageAtFrontOfQueue()发送的MSG_LOCATION_CHANGED相关消息并处理;

handleMessage(Message msg) {

handleLocationChanged() {

handleLocationChangedLocked () {

// Broadcast location or status to all listeners

for (UpdateRecord r : records) {

if (shouldBroadcastSafe()) {

receiver.callLocationChangedLocked(notifyLocation);

}

}

}

}

}

private static boolean shouldBroadcastSafe(Location loc, Location lastLoc, UpdateRecord record, long now) {

// Always broadcast the first update

if (lastLoc == null) {

return true;

}

// Check whether sufficient time has passed

long minTime = record.mRealRequest.getFastestInterval();

long delta = (loc.getElapsedRealtimeNanos() - lastLoc.getElapsedRealtimeNanos())

/ NANOS_PER_MILLI;

if (delta < minTime - MAX_PROVIDER_SCHEDULING_JITTER_MS) {

return false;

}

// Check whether sufficient distance has been traveled

double minDistance = record.mRealRequest.getSmallestDisplacement();

if (minDistance > 0.0) {

if (loc.distanceTo(lastLoc) <= minDistance) {

return false;

}

}

// Check whether sufficient number of udpates is left

if (record.mRealRequest.getNumUpdates() <= 0) {

return false;

}

// Check whether the expiry date has passed

return record.mRealRequest.getExpireAt() >= now;

}

receiver.callLocationChangedLocked(Location location) {

//mListener 其实是 requestLocationUpdates()时传入ysdlq,即封装过的 listener

/*requestLocationUpdates(request, listener, null, null) {

// wrap the listener class

mService.requestLocationUpdates(request, transport, intent, packageName) {

// new receiver(listener);

requestLocationUpdatesLocked(sanitizedRequest, recevier, pid, uid, packageName);

}

}*/

mListener.onLocationChanged(new Location(location));

}

frameworksbaselocationjavaandroidlocationLocationManager.java

TAG = "LocationManager";

mListenerHandler.sendMessage(msg);

}

case TYPE_LOCATION_CHANGED:

mListener.onLocationChanged(location);

// 这里才调到了用户最初lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, minTime, minDistance, locationListener);

// 函数时传入的 locationListener.onLocationChanged();

}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。