ContextWrapper.registerReceiver() 函数如何动态注册接收器?
How does ContextWrapper.registerReceiver() function works to dynamically register a receiver?
我目前正在重新学习 Android 中的组件之一,广播接收器。
我们知道:registerReceiver(Broadcastreceiver receiver, Intentfilter filter)
用于动态注册一个receiver到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。它是一个抽象 class,所有方法都保持为抽象方法,没有实现逻辑,包括 registerReceiver。方法代码:
public abstract Intent registerReceiver(@Nullable BroadcastReceiver
receiver,IntentFilter filter);
所以没有逻辑说明接收器和 Intent Filter 是如何工作来注册广播接收器的。但是我 Google 它发现其他人的源代码与我的不同:他们有一个 ContextImpl Class 来实现 Context class 并且这是有道理的:
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包源码和他的不一样?最重要的是:我仍然可以在项目中使用广播接收器而没有任何问题,但是如果函数调用链最终导致抽象函数而没有实现逻辑但仍然可以使用,那怎么可能呢?
我会调试流程并查看它将带您到哪里,而不是按住 Ctrl 键并单击。
Ctrl+click 总是会把你带到一个方法的起源,但是因为它是一个抽象 class 它不知道哪个 class 扩展了它(从所有可能的 class 执行此操作的人)是在特定时刻调用该方法的人。
我目前正在重新学习 Android 中的组件之一,广播接收器。
我们知道:registerReceiver(Broadcastreceiver receiver, Intentfilter filter)
用于动态注册一个receiver到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。它是一个抽象 class,所有方法都保持为抽象方法,没有实现逻辑,包括 registerReceiver。方法代码:
public abstract Intent registerReceiver(@Nullable BroadcastReceiver
receiver,IntentFilter filter);
所以没有逻辑说明接收器和 Intent Filter 是如何工作来注册广播接收器的。但是我 Google 它发现其他人的源代码与我的不同:他们有一个 ContextImpl Class 来实现 Context class 并且这是有道理的:
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包源码和他的不一样?最重要的是:我仍然可以在项目中使用广播接收器而没有任何问题,但是如果函数调用链最终导致抽象函数而没有实现逻辑但仍然可以使用,那怎么可能呢?
我会调试流程并查看它将带您到哪里,而不是按住 Ctrl 键并单击。
Ctrl+click 总是会把你带到一个方法的起源,但是因为它是一个抽象 class 它不知道哪个 class 扩展了它(从所有可能的 class 执行此操作的人)是在特定时刻调用该方法的人。