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删除,并且我们需要注册它的另一个实例?