广播接收器作为安卓系统的内部类

2022-09-02 02:27:15

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

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

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

但是我收到以下错误:

无法实例化 receiver org.example.test.OuterClass$InnerClass

我该如何解决这个问题?


答案 1

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

答案 2

表示法不表示内部类,而是静态嵌套类。因此,理论上有2种方法可以解决这个特定问题:$

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

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

如果这不能解决问题,那么显然Android根本不会以这种方式吃它。然后,我会将其提取到它自己的独立类中。

另请参阅:


推荐