Java 如何将参数传递给BroadcastReceiver的子类?
按下应用程序时,我成功地通过应用程序获取了我的数据,但其中一个按钮需要调用MyCustomActivity中的方法。问题是onReceive的第一个参数是一个上下文,不能强制转换到Activity并使用MyCustomActivity的内部类,除非它是静态的(这与无法访问MyCustomActivity的方法的问题相同) 因此,留给我的唯一选项(为了支持2.x和4.1)是将活动作为参数传递给 但当实例化它的唯一方法是通过以下方式时,我该如何做到这一点:Java 如何将参数传递给BroadcastReceiver的子类?,java,android,broadcastreceiver,android-audiomanager,Java,Android,Broadcastreceiver,Android Audiomanager,按下应用程序时,我成功地通过应用程序获取了我的数据,但其中一个按钮需要调用MyCustomActivity中的方法。问题是onReceive的第一个参数是一个上下文,不能强制转换到Activity并使用MyCustomActivity的内部类,除非它是静态的(这与无法访问MyCustomActivity的方法的问题相同) 因此,留给我的唯一选项(为了支持2.x和4.1)是将活动作为参数传递给 但当实例化它的唯一方法是通过以下方式时,我该如何做到这一点: private ComponentName
private ComponentName mRemoteControlReceiver = new ComponentName(this, RemoteControlReceiver.class);
哪个不接受任何附加参数
你知道如何绕过这个限制吗
注意:如果我试图将RemoteControlReceiver
定义为具有带参数的构造函数,我会收到以下异常:
E/AndroidRuntime(2836): java.lang.RuntimeException: Unable to instantiate receiver com.example.RemoteControlReceiver: java.lang.InstantiationException: can't instantiate class com.example.RemoteControlReceiver; no empty constructor
Caused by:
E/AndroidRuntime(2836): Caused by: java.lang.InstantiationException: can't instantiate class com.example.RemoteControlReceiver; no empty constructor
E/AndroidRuntime(2836): at java.lang.Class.newInstanceImpl(Native Method)
E/AndroidRuntime(2836): at java.lang.Class.newInstance(Class.java:1319)
E/AndroidRuntime(2836): at android.app.ActivityThread.handleReceiver(ActivityThread.java:2205)
因此很明显,这个新的registerDiaButtoneVentReceiver需求(在Android 4.1中引入)需要一个空构造函数
没有办法解决这个问题吗
例如,是否有方法获取对实际RemoteControlReceiver对象的引用(通过mAudioManager.RegisterMaudiaButtoneVentReceiver()间接实例化)?以便我可以使用访问器在RemoteControlReceiver的数据成员被实例化后设置它?要求在应用程序清单中声明BroadcastReceiver。这意味着receiver必须是一个独立类,这意味着它对您当前的活动或服务一无所知
为了将此消息发送到您的活动或服务中,您有许多选项:
- 对活动或服务使用静态全局设置,以便接收者可以将消息转发给它。这通常不是一个好主意,因为它会导致泄漏,并且在以后需要更改代码时适应性不强。通常应避免使用静态设置
- 将消息重新广播到特定类,该类恰好是要调用的活动或服务的内部类。例如,在RegisterDiaButtoneVentReceiver的BroadcastReceiver中:
// Standalone class, declared in the manifest
public class ButtonReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, final Intent intent) {
Intent intent = new Intent();
intent.setAction("com.foo.ACTION");
// Rebroadcasts to your own receiver.
// This receiver is not exported; it'll only be received if the receiver is currently registered.
context.sendBroadcast(intent);
}
}
在你的活动中:
class MyActivity extends Activity {
private BroadcastReceiver myReceiver = new BroadcastReceiver() {
@Override
public void onReceive(final Context context, final Intent intent) {
MyActivity.this.onMessageReceived();
}
}
@Override
protected void onResume() {
registerReceiver(myReceiver, new IntentFilter("com.foo.ACTION"));
}
@Override
protected void onPause() {
unregisterReceiver(myReceiver);
}
private void onMessageReceived() {
}
}
- 与上述方法类似,它不一定是广播,它可能是传递给活动的意图,具体取决于您的用例。要做到这一点,而不是使用sendBroadcast,您需要使用startActivity(如果您使用的是服务,则使用startService)
您可以在活动的onResume/onCreate中创建和注册BroadcastReceiver,并在onPause/onStop中注销。这样,当前活动可以处理其生命周期,并且接收器应该能够与其容器(活动)通信@SudarNimalan我已经尝试过这个。这个。它在4.1中不起作用。我需要能够以某种方式让RemoteControlReceiver
(不是BroadcastReceiver!)知道我的CustomActivity。谢谢。这是一个困难的问题,但这里有一个想法:你能在接收时检查通过的吗?或者使用这个?看到这个答案可能对你有帮助。