Receiver作为Android中的内部类

在我的代码中有一个扩展BroadcastReceiver的内部类。

我已经AndroidManifest.xml下行添加到AndroidManifest.xml

 <receiver android:name="OuterClass$InnerClass android:enabled="true"/> 

但是我收到以下错误:

无法实例化接收器org.example.test.OuterClass $ InnerClass

我该如何解决这个问题?

Related of "Receiver作为Android中的内部类"

一个(非静态的) 内部类不能通过AndroidManifest.xml( 在BroadcastReceiver上的Android开发者文档 )实例化:

您可以使用Context.registerReceiver()dynamic注册此类的实例,也可以通过AndroidManifest.xml中的标记静态发布实现。

所以你可以dynamic注册接收器。 在我的应用程序中,我想要使用Google的云到设备消息传递(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> 

我删除了接收器部分,并dynamic地注册接收器,如下所示:

 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 { ... } } 

$表示法不表示一个内部类,而是一个静态嵌套类。 所以理论上有两种解决这个问题的方法:

  1. 将它表示为一个真正的内部类,即OuterClass.InnerClass (不知道如果Android会吃掉,因为内部类的实例化比实现Class#newInstance()要复杂得多。

  2. 声明该类是一个静态嵌套类,即添加static class InnerClass {} 。 这样OuterClass$InnerClass必须能够创build一个新的实例。

如果这不能解决问题,那么Android显然不会那么吃。 那么我只是把它提取到它自己的独立类中。

也可以看看:

  • Java教程 – 嵌套类
  • 用代码示例回答如何使用reflection实例化内部或静态嵌套类 (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" /> 

你不需要使用$ …如果你得到一个实际上并不是内部类的类的警告,那是因为你在你的包名中使用了大写字母 ,这不是常规的。

我也试着只把包名的第一个字母改成小写,警告和错误消失了。

我刚刚遇到同样的问题,我有一个服务与许多活动进行交stream,我也有一个接收器在我的服务作为内部类,当接收者得到消息时,它必须调用服务的方法。 所以它继续像这样:

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"/>