В настоящее время я переучиваю один из компонентов 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отличается от его?Наиболее важным является то, что я все еще могу использовать широковещательный приемник в проектах без единой проблемы, но как это вообще возможно, если цепочка вызовов функций в конце концов приводит к абстрактной функции без логики реализации, но все еще может использовать?