21

私のコードには、拡張する内部クラスがありますBroadcastReceiver

そして、次の行をに追加しましたAndroidManifest.xml

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

しかし、次のエラーが表示されます。

レシーバー org.example.test.OuterClass$InnerClass をインスタンス化できません

この問題を解決するにはどうすればよいですか?

4

6 に答える 6

33

(非静的)内部クラスは、 AndroidManifest.xml ( BroadcastReceiver に関する Android 開発者向けドキュメント)を介して 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
    {
        ...
    }
}
于 2012-06-01T14:13:21.600 に答える
18

表記は内部クラスを示すの$ではなく、静的にネストされたクラスを示します。したがって、理論的には、この特定の問題を解決する2つの方法があります。

  1. それを実際の内部クラスとして示します。つまりOuterClass.InnerClass、内部クラスのインスタンス化は単に行うよりもかなり複雑なので、Androidがそれを食べるかどうかはわかりませんClass#newInstance()

  2. 代わりに、クラスを静的なネストされたクラスとして宣言します。つまり、に追加staticclass InnerClass {}ます。このようにOuterClass$InnerClassして、はそれから新しいインスタンスを作成できる必要があります。

それでも問題が解決しない場合は、Androidがそのように食べていないようです。次に、それを独自のスタンドアロンクラスに抽出します。

参照:

于 2010-08-31T14:29:01.213 に答える
7

ドットと終了引用符だけが欠落している可能性がありますか?好き

<receiver android:name=".OuterClass$InnerClass" android:enabled="true"/>
于 2010-08-31T12:50:36.277 に答える
4

これは私のために働いたものです:

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" />
于 2014-10-13T18:38:22.487 に答える