Android 设备管理AndroidManifest.xml,为什么接收器名称中有问号?

Android Device Administration AndroidManifest.xml, why the question mark in the receiver name?

看Androiddocumentation on Device Administration里面说要这样设置:

<activity android:name=".app.DeviceAdminSample" ... ></activity>

<receiver android:name=".app.DeviceAdminSample$DeviceAdminSampleReceiver" ... ></receiver>

public class DeviceAdminSample extends DeviceAdminReceiver { ... }

在我的应用程序上设置接收者名称时,Studio 在 ...$DeviceAdminSampleReceiver" 部分给出了 "Cannot resolve symbol" 错误,因此我将接收者名称和 class 名称设置为"MyDeviceAdminReceiver"

示例中的接收器名称与设备管理接收器 class 名称不匹配。美元符号的意义是什么?为什么示例中receiver和receiver的名字不同class?

“$”语法表示 DeviceAdminSampleReceiverDeviceAdminSample 的内部 class。这是 Java 表示法。

您发布的文档 link 引用了与 Android SDK 一起分发的示例:

SDK_ROOT/ApiDemos/app/src/main/java/com/example/android/apis/app/DeviceAdminSample.java

在此示例中,您可以看到上述 class 关系是这样的:

public class DeviceAdminSample extends PreferenceActivity {
   ...
   public static class DeviceAdminSampleReceiver extends DeviceAdminReceiver {
   ...
   }
}

因此,如果您想遵循与示例相同的模式,那么您必须具有相同的 inner-class 关系。尽管 Android 中没有任何内容要求您这样做。您只需要确保清单中的 receiver 元素指向现有的 class(无论是否在内部)。