Java Android中作为内部类的广播接收机
在我的代码中,有一个内部类扩展了Java Android中作为内部类的广播接收机,java,android,broadcastreceiver,Java,Android,Broadcastreceiver,在我的代码中,有一个内部类扩展了BroadcastReceiver 我在AndroidManifest.xml中添加了以下行: <receiver android:name="OuterClass$InnerClass android:enabled="true"/> 是否只缺少一个点和一个结束语?像 <receiver android:name=".OuterClass$InnerClass" android:enabled="true"/> 符号$不表示内部类,而
BroadcastReceiver
我在AndroidManifest.xml
中添加了以下行:
<receiver android:name="OuterClass$InnerClass android:enabled="true"/>
是否只缺少一个点和一个结束语?像
<receiver android:name=".OuterClass$InnerClass" android:enabled="true"/>
符号$
不表示内部类,而是表示静态嵌套类。因此,理论上有两种方法可以解决这个特殊问题:
将它表示为一个真正的内部类,即OuterClass.InnerClass
(不确定Android是否会接受它,因为内部类的实例化比只执行class\newInstance()
要复杂得多
将类声明为静态嵌套类,即将static
添加到class InnerClass{}
中。这样,OuterClass$InnerClass
必须能够从中创建新实例
如果这不能解决问题,那么很显然Android根本就不会这样吃它。我会将它解压缩到自己的独立类中
另见:
- (就像安卓应该做的那样“隐蔽”)
安卓无法通过AndroidManifest.xml()实例化(非静态):
您可以使用
registerReceiver()或静态发布实现
通过AndroidManifest.xml中的标记
因此,您可以动态注册接收者。在我的应用程序中,我希望使用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>
这就是我的工作原理:
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();
}
}
}
<receiver android:name=".XXService$XXReceiver" android:enabled="true"/>
2.在manifest.xml中注册接收者:
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();
}
}
}
<receiver android:name=".XXService$XXReceiver" android:enabled="true"/>
您不需要使用$。。。
如果您得到一个实际上不是内部类的类的警告,那是因为您在包名中使用了大写字符,这是不常规的
我还尝试将软件包名称的第一个字母改为小写,警告和错误消失。AndroidManifest.xml行不知何故丢失,无法显示-请检查Hey Martin,thanx,请立即检查..thanx以获取答案BalusC:)但在我的例子中,我想调用一个异步类,它是使用Alarm的活动的内部类。有什么办法吗?我可以确认使用外部$内部表示法使用静态嵌套类是可能的;在我的例子中,我正在创建一个AppWidgetProvider接收器,内部类扩展了外部类,为每个大小指定一个唯一的AppWidgetProvider。这里的OuterClassConnector
是什么?我没有发现,在我现在的代码中,它在过去两年中发生了很大的变化。我认为它是由android在我实现GoogleapClient.OnConnectionFailedListener、GoogleapClient.ConnectionCallbacks接口时生成的。但是现在我使用了一个带有显式意图类的解决方案:newintent(mContext,InnerStaticClass.class);谢谢这对我有用。但我也在清单中定义的接收者标签中定义了:android:enabled=“true”。这对我来说真的很令人印象深刻。也许正是我想要的。我会试试这个,如果它有效的话,我会恢复。这是有效的。非常感谢。我没有写android:enable=“true”
,但它仍在工作。有什么想法吗?或者那只是为了安全起见?很有可能,而且小到可以错过。好的!我有一个问题。在接收到意图后注册的MyC2dmReceiver对象会发生什么情况?它是否保持活动状态并准备接收另一个实例,或者它是否可以被GC删除,并且我们需要注册它的另一个实例?