接收者作为Android中的内部类

Kun*_*ati 19 java android broadcastreceiver

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

我已将以下行添加到AndroidManifest.xml:

<receiver android:name="OuterClass$InnerClass android:enabled="true"/>
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误:

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

我该如何解决这个问题?

Ber*_*ink 32

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>
Run Code Online (Sandbox Code Playgroud)

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

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
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)


Bal*_*usC 17

$符号不表示内部类,但静态嵌套类.因此理论上有2种方法可以解决这个特殊问题:

  1. 将它表示为一个真正的内部类,即OuterClass.InnerClass(不确定Android是否会吃掉它,因为内部类的实例化比仅仅做得复杂得多)Class#newInstance().

  2. 将类声明为静态嵌套类,即添加staticclass InnerClass {}.这种方式OuterClass$InnerClass必须能够从中创建一个新实例.

如果这不能解决问题,那么显然Android根本不会那样吃掉它.我只是将它提取到自己的独立类中.

也可以看看:


Don*_*Gru 7

难道只有一个点和一个收盘报价丢失了吗?喜欢

<receiver android:name=".OuterClass$InnerClass" android:enabled="true"/>
Run Code Online (Sandbox Code Playgroud)