如何向BroadcastReceiver的子类传递参数?

2024-02-21

我设法得到了我的耳机按钮被识别 https://stackoverflow.com/q/15057291/636571按下时由我的应用程序调用,但其中一个按钮需要调用 MyCustomActivity 中的方法。问题是 onReceive 的第一个参数是一个 Context,无法转换为 Activity 并使用 MyCustomActivity内部类 不适用于 Android 4.1 https://stackoverflow.com/a/13576130/636571除非它是静态的(同样存在无法访问 MyCustomActivity 方法的问题。

因此,留给我的唯一选择(为了支持 2.x 和 4.1)是将 Activity 作为参数传递给遥控接收器 https://stackoverflow.com/q/15057291/636571.

但是,当实例化它的唯一方法是通过以下方式时,我该怎么做:

private ComponentName mRemoteControlReceiver = new ComponentName(this, RemoteControlReceiver.class);

哪个不接受任何附加参数?

知道如何解决这个限制吗?

Note:如果我尝试定义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 要求(在 Android 4.1 中引入)期望空构造函数.

没有办法解决这个问题吗?

例如,有没有办法获取对实际 RemoteControlReceiver 对象的引用(通过间接实例化)mAudioManager.registerMediaButtonEventReceiver())?这样我就可以使用访问器来设置 RemoteControlReceiver 的数据成员after它已经被实例化了吗?


注册MediaButtonEventReceiver http://developer.android.com/reference/android/media/AudioManager.html#registerMediaButtonEventReceiver%28android.content.ComponentName%29要求在应用程序清单中声明 BroadcastReceiver。这意味着接收者必须是一个独立的类,这意味着它对您当前的活动或服务一无所知。

为了将此消息发送到您的活动或服务,您有多种选择:

  • 对活动或服务使用静态全局,以便接收者可以将消息转发给它。这通常不是一个好主意,因为它会导致泄漏,并且当您稍后想要更改代码时适应性不强。通常要避免静电。

  • 将消息重新广播到特定类,该类恰好是您要调用的活动或服务的内部类。例如。在 BroadcastReceiver 中注册MediaButtonEventReceiver:

    // 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() {
        }
    }
  • 与上面的方法类似,它不一定是广播,它可以是传递给活动的 Intent,具体取决于您的用例。要执行此操作,而不是使用 sendBroadcast,您可以使用 startActivity(如果您使用服务,则使用 startService)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何向BroadcastReceiver的子类传递参数? 的相关文章

随机推荐

  • XML 转换导致 FileNotFoundException

    由于缺乏信息 我之前发布的问题已关闭 如果我在这里遗漏了什么 请告诉我 转换器似乎将 file 添加到我的文件路径的开头 我在 Solaris 环境中工作 应用转换时会发生以下情况 DOMSource sourcexml new DOMSo
  • Android模拟器无法创建上下文0x3005

    我对 Android 开发完全陌生 我正在尝试在 Android 中执行一个小任务 注册表单 但是 我收到以下错误 2013 12 05 11 06 26 Emulator could not get wglGetExtensionsStr
  • C++ 随机猜数字游戏

    我必须编写一个程序来运行随机猜谜游戏 游戏的数字是从 1 到 100 猜测者可以尝试 20 次 最后应该被问是否愿意再玩一次 如果猜测者高或低 还必须有多种打印输出选项 我已经完成了程序的一部分 我知道我仍然需要添加其他打印输出选项 但现在
  • 解释UnixTime毫秒

    我正在尝试找到更好的方法在 C 中将 DateTime 转换为 unix 时间戳 我发现有一个 DateTimeOffset ToUnixTimeMilliseconds 方法 public long ToUnixTimeMilliseco
  • MvxCachingFragmentCompatActivity消失了吗?

    我正在尝试升级到 MvvmCross 5 2 但在 MvxCachingFragmentCompatActivity 上出现语法错误 这个班级消失了吗 正如 5 2 博客中所解释的 https www mvvmcross com mvvmc
  • 如何更新d3表?

    鼠标移动时更新 d3 js 表时遇到一些问题 这是一个简化的example https jsfiddle net lszhou2115 npzjLng9 6 在jsfiddle中 这是主要代码 function mousemove var
  • 如何修复 ubuntu 中的“没有名为‘kivy._clock’的模块”错误?

    我正在尝试使用 Ubuntu 16 04 for Python 3 6 安装 kivy GUI lib 我尝试执行kivy官方网站中的步骤 https kivy org doc stable installation installatio
  • GAE java中通过证书进行客户端身份验证

    我正在写一份申请GAE java通过其身份验证用户证书 我已经使用创建了一个自签名证书keytool在客户端 我还在 Google 应用程序引擎中为我的应用程序启用 https 请求 申请流程非常简单 用户使用任何浏览器进入应用程序的主页
  • 为什么 c++ std::max_element 这么慢?

    我需要找到向量中的最大元素 所以我使用std max element 但我发现它是一个非常慢的函数 所以我编写了自己的版本并设法获得 x3 更好的性能 下面是代码 include
  • 如果等于运算符没有被空格包围,为什么它不起作用?

    我尝试了以下脚本 bin bash var1 Test 1 var2 Test 2 if var1 var2 then echo Equal else echo Not equal fi 它给了我Equal 虽然应该已经打印出来了Not e
  • 如何在 ASP.NET Core 2.0 和 EF Core 2.0 中将应用程序设置从项目根获取到 IDesignTimeDbContextFactory 实现

    我正在 ASP NET Core 2 0 中构建应用程序 但在 EntityFramework 迁移方面遇到问题 我的 DbContext 位于一个单独的项目中 解决方案名称 项目名称前缀 Data 因此我创建了 IDesignTimeDb
  • D3 动态重绘Y轴

    我想创建一个具有多个 线性 轴的动态图 绘制轴后 我想 当新数据到达时 更改数据域并重新绘制 更新轴 我可以使用 D3 选择现有轴并执行此操作 还是必须在代码中显式保存每个轴 我希望我的问题不会令人困惑 init all Y Axis ea
  • C++ STL 容器和就地构建

    请考虑以下事项 class CMyClass public CMyClass printf Constructor n CMyClass const CMyClass printf Copy constructor n int main s
  • 什么是棱镜?

    我试图更深入地了解lens库 所以我尝试使用它提供的类型 我已经有了一些使用镜头的经验 知道它们的强大和方便 所以我转向了 Prisms 但我有点迷失了 棱镜似乎可以做两件事 确定实体是否属于总和类型的特定分支 如果属于 则捕获元组或单例中
  • Golang 方法函数中的接收器类型无效

    我正在尝试制作一个简单的包来将 SSH 命令发送到服务器 我有以下代码 type Connection ssh Client func Connect addr user password string conn Connection er
  • 服务器如何知道请求来自客户端,而不是窃听的黑客?

    我有一个简单的问题 我找不到简单的答案 可能我遗漏了一些东西 或者我不知道某些网络概念是如何工作的 我想知道我不知道的事情 简单地说 问题是虽然窃听是可能的 但服务器如何知道请求来自客户端 而不是窃听的黑客 设想 无论我采用什么安全策略 我
  • 使用 Intellij 的 Yeoman(想法 12)

    使用 OSX 10 8 4 Idea 12 节点 v0 10 17 yo v1 0 3 当尝试使用 Yeoman 作为外部工具时 我得到 usr local bin yo angular env node No such file or d
  • 如何在ConstraintLayout中使用ViewStub?

    似乎在充气时ViewStub in a ConstraintLayout 生成的视图失去了所有约束 我想我们可以使用以下方法定义膨胀视图的约束ConstraintSet 但这违背了目的ViewStub 有没有好的方法可以做到这一点 有一个简
  • Play 框架不会运行内联 JavaScript

    我正在尝试使用 play 框架 2 6 和 scala 设置一个简单的应用程序 但我似乎无法在 html 模板上运行内联 javascript 我不断收到错误 拒绝执行内联脚本 因为它违反了以下内容安全策略指令 default src se
  • 如何向BroadcastReceiver的子类传递参数?

    我设法得到了我的耳机按钮被识别 https stackoverflow com q 15057291 636571按下时由我的应用程序调用 但其中一个按钮需要调用 MyCustomActivity 中的方法 问题是 onReceive 的第