如何将参数传递给广播接收器的子类?(How to pass a parameter to a sub

2019-08-17 04:47发布

我设法让我的耳机按钮得到认可按下时我的应用程序,但其中一个按钮需要调用这是在MyCustomActivity的方法。 问题是的onReceive的第一个参数是不能转换到活动并使用MyCustomActivity的内部类上下文不会是Android 4.1的工作 ,除非它是静态的(它有没有能力获得MyCustomActivity的方法同样的问题。

所以留给我的(为了支持2.x和4.1)的唯一选择是通过活动作为参数传递给RemoteControlReceiver 。

但我怎么做,何时实例它的唯一方法是通过:

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)

所以,很显然,这个新registerMediaButtonEventReceiver要求(安卓4.1中引入)预计一个空的构造

有没有办法解决呢?

例如,有一种方式来获得实际RemoteControlReceiver对象的引用(经由间接实例mAudioManager.registerMediaButtonEventReceiver() 所以,我可以用一个访问设置RemoteControlReceiver的数据成员已被实例化

Answer 1:

registerMediaButtonEventReceiver需要在应用程序清单中声明的广播接收器。 这意味着接收机必须是一个独立的类,这意味着它什么都不知道关于你的当前活动或服务。

为了得到这个消息,您的活动或服务,你有多种选择:

  • 使用静态全局的活动或服务,以便接收器可以将邮件转发到它。 这通常不是一个好主意,因为它会导致泄漏,当你想以后更改代码不是很适应。 静一般被避免。

  • 再广播消息到具体的类别,这恰好是一个内部类,你要调用的活动或服务的。 例如,在广播接收器的registerMediaButtonEventReceiver:

     // 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这一点,你(如果你正在使用的服务或startService)使用startActivity。


文章来源: How to pass a parameter to a subclass of BroadcastReceiver?