【问题标题】:Android Device Administration AndroidManifest.xml, why the question mark in the receiver name?Android 设备管理 AndroidManifest.xml,为什么接收方名称中有问号?
【发布时间】:2016-01-25 15:49:54
【问题描述】:

在阅读Android documentation on Device Administration时,它说设置如下:

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

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

public class DeviceAdminSample extends DeviceAdminReceiver { ... }

在我的应用程序上设置接收器名称时,Studio 在...$DeviceAdminSampleReceiver" 部分给出了“无法解析符号”错误,因此我将接收器名称和类名设置为“MyDeviceAdminReceiver”

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

【问题讨论】:

  • “$”表示 Java 表示法中的内部类。我怀疑某些 Android 工具还没有准备好处理内部类。我建议只使用顶级类。
  • 顺便说一句,您应该通过 (a) 准确说明您所引用的文档,(b) 解释您所说的“Studio choked”是什么意思,从而使您的问题更加清晰。
  • 我做了您要求的更改。我没有将接收器设置为内部类,这可以解释错误。您的回复回答了我在 AndroidManifest.xml 中正确设置内部类接收器的其他问题。
  • 只是为了结束这个循环,我已经发布了上面的答案,还有一些额外的细节。

标签: java android device-admin


【解决方案1】:

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

您发布的文档链接是指随 Android SDK 分发的示例:

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

在这个示例中,可以看到上面的类关系是这样的:

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

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

【讨论】:

  • 也是为了关闭;我将 DeviceAdminSampleReceiver 移到了主要活动的内部类。当我将它设置为接收器时,Studio 立即识别并自动填写了名称、美元符号和所有内容。 :)
猜你喜欢
  • 2013-09-29
  • 1970-01-01
  • 1970-01-01
  • 2015-03-05
  • 2013-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多