Как работает функция ContextWrapper.registerReceiver () для динамической регистрации получателя? - PullRequest
0 голосов
/ 02 марта 2019

В настоящее время я переучиваю один из компонентов Android-приемника вещания.

Как известно: registerReceiver(Broadcastreceiver receiver, Intentfilter filter) используется для динамической регистрации получателя в AMS.Поэтому я CTRL + щелкаю эту функцию в Android Studio, чтобы посмотреть, как она работает, и попадаю в ContextWrapper.java:

public class ContextWrapper extends Context { 
    Context mBase;

    public ContextWrapper(Context base) {
        mBase = base; } ...//various of methods

public Intent registerReceiver(
    BroadcastReceiver receiver, IntentFilter filter) {
    return **mBase.registerReceiver(receiver, filter);** }
}

Поэтому я нажимаю метод и попадаю в Context.java.Это абстрактный класс, все методы остаются как абстрактные методы без логики реализации, включая registerReceiver.Коды методов:

 public abstract Intent registerReceiver(@Nullable BroadcastReceiver 
                                   receiver,IntentFilter filter);

Таким образом, отсутствует логика, показывающая, как работает приемник и Intent Filter для регистрации широковещательного приемника.Но я нашел его в Google и обнаружил, что исходный код других отличается от моего: у них есть класс ContextImpl для реализации класса Context, и это имеет смысл:

public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
        String broadcastPermission, Handler scheduler) {
    return **registerReceiverInternal**(receiver, getUserId(),
            filter, broadcastPermission, scheduler, getOuterContext());
    }

Нажмите registerReceiverInternal, и они попадут в ContextImpl.java:

private Intent registerReceiverInternal(BroadcastReceiver receiver, int 
                                   userId,IntentFilter filter, String 
             broadcastPermission,Handler scheduler, Context context) {
//Implementation logic about how Handler distribute AMS etc.
}

Основная проблема заключается в разнице в возвращаемом значении между двумя функциями: моя - это: mBase.registerReceiver(), а другие - registerReceiverInternal().

Почему исходный код моего пакета Androidотличается от его?Наиболее важным является то, что я все еще могу использовать широковещательный приемник в проектах без единой проблемы, но как это вообще возможно, если цепочка вызовов функций в конце концов приводит к абстрактной функции без логики реализации, но все еще может использовать?

1 Ответ

0 голосов
/ 02 марта 2019

Вместо Ctrl + щелчок я бы отладил поток и посмотрел, куда он вас приведет.

Ctrl + click всегда приведет вас к источнику метода, но поскольку он является абстрактным классом, он не знает, какой класс, который его расширяет (из всех возможных классов, которые это делают), является вызывающимметод в тот конкретный момент.

...