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

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

android LocationManager注册LocationListener过程

private LocationManager lm;
private LocationListener locationListener = new LocationListener() {
    public void onLocationChanged(Location location){}
}

long minTime = 700;
float minDistance = 0.0f;
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, minTime, minDistance, locationListener);
其中minTime, minDistance定义后在 callLocationChangedLocked() 前会通过 shouldBroadcastSafe()进行条件检查;

frameworks\base\location\java\android\location\LocationManager.java
private final ILocationManager mService;
requestLocationUpdates(LocationRequest request, LocationListener listener, Looper looper, PendingIntent intent) {
    requestLocationUpdates(request, listener, null, null) {
        // wrap the listener class
        ListenerTransport transport = wrapListener(listener, looper);
        mService.requestLocationUpdates(request, transport, intent, packageName) {
            // new receiver(listener);
            requestLocationUpdatesLocked(sanitizedRequest, recevier, pid, uid, packageName);
        }
    }
}

frameworks\base\services\core\java\com\android\server\LocationManagerService.java
private final class Receiver implements IBinder.DeathRecipient, PendingIntent.OnFinished {
    final ILocationListener mListener;
    final HashMap<String, UpdateRecord> mUpdateRecords = new HashMap<>();
    public boolean callLocationChangedLocked(Location location) {
        mListener.onLocationChanged(new Location(location));
    }
}

requestLocationUpdates(LocationRequest request, ILocationListener listener, PendingIntent intent, String packageName) {
    //在此new 一个 receiver (包装 ILocationListener 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

frameworks\base\services\core\jni\com_android_server_location_GnssLocationProvider.cpp
method_reportLocation reportLocation

frameworks\base\services\core\java\com\android\server\location\GnssLocationProvider.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);
}


frameworks\base\services\core\java\com\android\server\LocationManagerService.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;
}
其中hasAccuracy的实现如下,其实是在判断有无 HAS_HORIZONTAL_ACCURACY_MASK 即水平精度;
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);
                }
            }
        }
    }
}

其中shouldBroadcastSafe()定义如下
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()时传入的 ListenerTransport,即封装过的 listener
    /*requestLocationUpdates(request, listener, null, null) {
        // wrap the listener class
        ListenerTransport transport = wrapListener(listener, looper);
        mService.requestLocationUpdates(request, transport, intent, packageName) {
            // new receiver(listener);
            requestLocationUpdatesLocked(sanitizedRequest, recevier, pid, uid, packageName);
        }
    }*/
    mListener.onLocationChanged(new Location(location));
}

frameworks\base\location\java\android\location\LocationManager.java
TAG = "LocationManager";
ListenerTransport.onLocationChanged(Location location){
    mListenerHandler.sendMessage(msg);
}

ListenerTransport._handleMessage(Message msg){
    case TYPE_LOCATION_CHANGED:
        mListener.onLocationChanged(location);
        // 这里才调到了用户最初lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, minTime, minDistance, locationListener);
        // 函数时传入的 locationListener.onLocationChanged();
}


 

猜你喜欢

转载自blog.csdn.net/halazi100/article/details/106061631