[英]Android Broadcast Receiver as inner static class Passing a String
[英]Broadcast Receiver as inner class in Android
在我的代码中有一个扩展BroadcastReceiver
的内部类。
我在AndroidManifest.xml
添加了以下行:
<receiver android:name="OuterClass$InnerClass android:enabled="true"/>
但我收到以下错误:
无法实例化接收器 org.example.test.OuterClass$InnerClass
我该如何解决这个问题?
Android 无法通过 AndroidManifest.xml( 关于 BroadcastReceiver 的 Android 开发人员文档)实例化(非静态) 内部类:
您可以使用 Context.registerReceiver() 动态注册此类的实例,也可以通过 AndroidManifest.xml 中的标记静态发布实现。
所以你可以动态注册接收器。 在我的应用程序中,我想对使用 Google 的 Cloud to Device Messaging (C2DM) 执行相同的操作,并且我的原始 AndroidManifest.xml 包含:
<application...>
<receiver android:name=".MyC2dmReceiver" android:permission="com.google.android.c2dm.permission.SEND">
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<category android:name="com.example.myapp" />
</intent-filter>
<intent-filter>
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="com.example.myapp" />
</intent-filter>
</receiver>
</application>
我删除了该接收器部分并按如下方式动态注册接收器:
public class AndroidService extends IntentService
{
...
@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
IntentFilter filter = new IntentFilter();
filter.addAction("com.google.android.c2dm.intent.RECEIVE");
filter.addAction("com.google.android.c2dm.intent.REGISTRATION");
filter.addCategory("com.example.myapp");
this.registerReceiver(new MyC2dmReceiver(), filter, "com.google.android.c2dm.permission.SEND", null);
return super.onStartCommand(intent,flags,startId);
}
public class MyC2dmReceiver extends BroadcastReceiver
{
...
}
}
$
符号不表示内部类,而是静态嵌套类。 所以理论上有两种方法可以解决这个特定问题:
将它表示为一个真正的内部类,即OuterClass.InnerClass
(虽然不确定 Android 是否会吃掉它,因为内部类的实例化比只执行Class#newInstance()
复杂得多。
将该类声明为静态嵌套类, class InnerClass {}
添加static
。 这样OuterClass$InnerClass
必须能够从中创建一个新实例。
如果这不能解决问题,那么显然 Android 根本不会那样吃。 我只是将它提取到它自己的独立类中。
可能只是缺少一个点和一个结束语吗? 喜欢
<receiver android:name=".OuterClass$InnerClass" android:enabled="true"/>
这对我有用:
public class OuterClass {
public static class InnerStaticClass extends BroadcastReceiver {
@Override
public void onReceive(final Context context, final Intent intent) {
final Location location = (Location) intent.getExtras().get(LocationClient.KEY_LOCATION_CHANGED);
}
}
}
AndroidManifest.xml:
<receiver android:name=".OuterClass$OuterClassConnector$InnerStaticClass" />
我刚刚遇到了同样的问题。
我有一个服务可以与许多活动进行通信,而且我的服务中还有一个接收器作为内部类。 当接收者收到消息时,它必须调用服务方法。 所以它是这样的:
1.服务代码:
public class XXService extends Service{
// I want the inner receiver call the methd of XXService,
// so I have to write this constructor like this.
private XXService instance;
public XXService(){instance = this;}
public XXService getInstance(){
return instance;
}
public void sayHello(){
}
public static class XXReceiver extends BroadcastReceiver{
onReceive(......){
XXService.getInstance.sayHello();
}
}
}
2. 在 manifest.xml 中注册接收器:
<receiver android:name=".XXService$XXReceiver" android:enabled="true"/>
您不需要使用$ ... 如果您收到一个实际上不是内部类的类的警告,那是因为您在包名称中使用了大写字符,这不符合惯例。
我也尝试将包名的第一个字母改为小写,警告和错误消失了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.