接收器在Android的内部类

我有它扩展了BroadcastReceiver一个内部类。

而且我已经加入以下行的Andr​​oidManifest.xml:

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

但我得到的错误无法实例接收org.example.test.OuterClass $将InnerClass:

什么问题?

--------------解决方案-------------

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

您可以动态地注册这个类Context.registerReceiver()或静态的实例,通过你的AndroidManifest.xml中标记发布实施。

所以,你可以动态注册的接收器。 在我的应用程序,我想使用谷歌的云到设备消息(C2DM)和我原来的Andr​​oidManifest.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
{
...
}
}

$符号不表示内部类,而是一个静态的嵌套类。 因此,有理论上两种方式来解决这个特定的问题:

  1. 其表示作为一个真正的内部类,即OuterClass.InnerClass不知道不过,如果Android将吃,因为一个内部类的实例是非常不仅仅是在做更复杂的Class#newInstance()
  2. 声明类是静态的嵌套类代替,即添加staticclass InnerClass {} 这样OuterClass$InnerClass必须能够创建一个新的实例出来。

如果不解决这个问题,那么显然Android的根本不吃这种方式。 我只是将其解压缩到它自己的独立的类即可。

也可以看看:

  • Java教程 - 嵌套类
  • 与代码示例答案如何实例内或静态嵌套类使用反射(如机器人应该做的事“在幕后”)

难道说有只是一个点和结束引号缺少什么? 喜欢

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

这是为我工作:

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

分类:java的 时间:2012-09-20 人气:0
本文关键词: Java中,机器人
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.996 (s). 10 q(s)