首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

当BroadcastReceiver上的putExtra和getSerializable时,对象返回null

在Android开发中,BroadcastReceiver 是一种用于接收系统或应用广播消息的组件。putExtra()getSerializable() 是用于在 Intent 中传递和获取数据的两种方法。

基础概念

  • putExtra(): 用于将数据放入 Intent 中。可以传递基本数据类型、Parcelable 对象、Serializable 对象等。
  • getSerializable(): 用于从 Intent 中获取 Serializable 对象。

问题描述

当在 BroadcastReceiver 上使用 putExtra()getSerializable() 时,对象返回 null

可能的原因及解决方法

  1. 对象未正确传递:
    • 确保在发送广播时,对象已经正确放入 Intent 中。
    • 确保在发送广播时,对象已经正确放入 Intent 中。
  • 对象未正确实现 Serializable 接口:
    • 确保传递的对象实现了 Serializable 接口。
    • 确保传递的对象实现了 Serializable 接口。
  • 获取对象时键值不匹配:
    • 确保在接收广播时,使用的键值与发送广播时一致。
    • 确保在接收广播时,使用的键值与发送广播时一致。
  • 广播接收器未正确注册:
    • 确保广播接收器已经正确注册。
    • 确保广播接收器已经正确注册。

应用场景

  • 系统广播: 如网络状态变化、电池电量变化等。
  • 自定义广播: 如应用内部模块间的通信。

示例代码

发送广播:

代码语言:txt
复制
Intent intent = new Intent("com.example.ACTION");
MySerializableObject obj = new MySerializableObject();
intent.putExtra("key", obj);
sendBroadcast(intent);

接收广播:

代码语言:txt
复制
BroadcastReceiver receiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        MySerializableObject obj = (MySerializableObject) intent.getSerializableExtra("key");
        if (obj == null) {
            Log.e("BroadcastReceiver", "Object is null");
        } else {
            // 处理对象
        }
    }
};

IntentFilter filter = new IntentFilter("com.example.ACTION");
registerReceiver(receiver, filter);

参考链接

通过以上步骤,可以确保在 BroadcastReceiver 中正确传递和获取 Serializable 对象。如果仍然遇到问题,建议检查日志输出,进一步排查具体原因。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Android 点击通知栏消息打开activity,并判断app是否运行

flag不是必须的,什么情况下需要设置flag?当在广播接收器中跳转到activity时,当在service中转到activity时。...对于第二种情况,我参照了很多app的做法,现总结为以下两种: 点击通知栏消息打开activity按下返回键后判断app是否启动,如果没有启动就要启动app; 点击通知栏消息时判断app是否正在前台运行,...,返回1代表当前应用在前台运行,返回2代表当前应用在后台运行,返回0代表应用未启动(没有一个存活的activity)。...2.singleTop:如果某个Activity的Launch mode设置成singleTop,那么当该Activity位于栈顶的时候,再通过Intent跳转到本身这个Activity,则将不会创建一个新的实例压入栈中...B的Launch mode为singleTask,此时D通过Intent跳转到B,则栈的情况变成了:A B。而C和D被弹出销毁了,也就是说位于B之上的实例都被销毁了。

3.4K10

Android应用界面开发——BroadcastReceiver(实现基于Service的音乐播放器)

BroadcastReceiver:广播接收者,Android四大组件之一,这个组件本质上就是一个全局监听器,用于监听系统全局的广播消息。...BroadcastReceiver简介 ---- BroadcastReceiver用于接收程序(开发者开发的程序和系统程序)发出的Broadcast Intent,程序启动BroadcastReceiver...,并使用该Intent对象对外发送了一条广播。...;当点击Activity的界面按钮时,系统将通过发送广播通知后台Service来改变播放状态。...,并根据广播的消息内容改变Service的播放状态,当播放状态改变时,该Service对外发送一条广播,广播消息将会被前台Activity接收,前台Activity将会根据广播消息更新界面。

1.6K20
  • 责任链模式

    1.定义 责任链模式是行为型设计模式之一,它使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。...2.实战演练 用三个BroadcastReceiver来演示责任链事件处理 FirstReceiver (当limit==1000的时候获取msg打印并退出,否则添加一个新的msg给下一个Receicer...==100的时候获取msg和上一个reveicer添加的msg打印并退出,否则添加一个新的msg给下一个Receicer) public class SecondReceiver extends BroadcastReceiver...==10的时候获取msg和上一个reveicer添加的msg打印并退出,否则添加一个新的msg给下一个Receicer) public class ThirdReceiver extends BroadcastReceiver...("msg", "msg from MainActivity"); sendOrderedBroadcast(intent, null); 3.总结 1.优点 可以对请求者和处理者的关系解耦

    70950

    android Broadcast Receiver漏洞挖掘

    Broadcast Receiver安全场景和危害 BroadcastReceiver是Android的四大组件之一,这个组件涉及两个概念:广播发送者和广播接受者。...这里的广播实际上指的就是intent。...当发送一个广播时,系统会将发送的广播(intent)与系统中所有注册的符合条件的接收者的IntentFilter进行匹配,若匹配成功,则执行相应接收者的onReceive函数。...如果导出的BroadcastReceiver没有做权限控制,导致BroadcastReceiver组件可以接收一个外部可控url、或者其他命令,导致攻击者可以越权利用应用的一些特定功能,比如发送恶意广播...返回结果时需注意接收app是否会泄露信息。 发送的广播包含敏感信息时需指定广播接收器,使用显示意图或者setPackage(String packageName)。

    1.2K20

    Activity数据传递

    Bundle对象包含了多个方法来存入数据和取出数据,如下所示。 putXxx(String key , Xxx data):向 Bundle 中放入 int、long 等各种类型的数据。...getSerializable(String key, Serializable data):从 Bundle 中取出一个可序列化的对象。...其实用Intent传递数据以及对象时,它的内部也是调用了Bundle对象相应的put()方法,也就是说Intent内部也是用Bundle来实现数据传递的,只是封装了一层而已。...需要注意的是,getStringExtra(String str)方法传人的参数必须是MainActivity中intent.putExtra()方法中传人的key,否则会返回null。...,android:label属性是用来指定显示在标题栏上的名称的,如桌Activity设置了该属性,则跳到该Activity页面时标题栏会显示在Activity中配置的名称,否则显示在Application

    1.1K80

    Android的广播

    发送和接收流程 发送和接受的过程: 发送 首先在需要发送信息的地方 ,把要发送的信息和用于过滤的信息(如action 和 category)封装进intent对象,然后调用 Context.sendBroadcast...() 、sendOrderBroadcast()或sendStickBroadcast()方法,把intent对象以广播的形式发送出去 接收 当intent发送后,所有已经注册的BroadcastReceiver...文件中声明了对应权限的BroadcastReceiver才能就收到; 同样的,如果在注册BroadcastReceiver时指定了可接受的Broadcast的权限,则只有在包的AndroidManifest.xml...拥有此权限的Context对象所发送的Broadcast才能被这个BroadcastReceiver所接收。...虽然 广播的发送和接受都是通过intent类,但是广播intent完全和 启动activity的intent不同。 BroadcastReceiver是无法看到启动activity的intent的。

    1.1K120

    安卓应用安全指南 4.2.1 创建使用广播接收器 示例代码

    使用广播接收器的风险和对策,根据收到的广播的类型而有所不同。 你可以在以下判断流程中找到你的广播接收器。 接收应用无法检查发送广播的应用的包名称,它是链接伙伴所需的。...6) 小心并安全地处理收到的返回结果,即使数据来自相同应用中的接收器。...2) 小心并安全地处理收到的意图。 3) 返回结果时,不要包含敏感信息。 公共广播接收器的示例代码可以用于静态和动态广播接收器。...当向公共广播接收器发送广播时,需要注意广播可以被恶意软件接收。...9) 导出 APK 时,使用与发送应用相同的开发人员密钥对 APK 进行签名。 内部广播接收器的示例代码可用于静态和动态广播接收器。

    50020

    BroadcastReceiver详解以及应用

    public abstract void onReceive(Context context, Intent intent); 当收到注册的广播时,onReceive方法会被调用。...BroadcastReceiver有两种注册方式: 静态注册(在AndroidManifest.xml清单文件中注册) 动态注册(在代码中注册) 广播接收者静态注册方式 当我们需要一直接收某种广播时...动态注册 动态注册方式依赖于所注册的组件,当APP关闭后,组件对象都不在了动态注册的代码都不存在了,所动态注册监听的action自然不在生效。...本地广播 与有序和无序广播的全局广播(任何一方发出广播本手机的任何一个程序都能收到对应的广播)相比,本地广播是局部的广播基于本程序的广播,其他的程序无法收到这个广播。...,因为我存数据的时候是intent.putExtra("qian", "100");存入的。

    90931

    笔记:BroadcastReceiver的运行过程

    静态注册的广播,每次收到广播时一个Receiver被创建,在主线程中执行其onReceive()方法,方法返回后,Receiver组件即等待销毁。...mMainThread.getApplicationThread(), rd, filter, broadcastPermission); ... } mMainThread.getHandler()返回一个当前进程的主线程上的...也就是注册MyReceiver的Context对象,MyReceiver和MyActivity关联。...>(); 它以Receiver关联的Context对象(也就是执行注册的context对象)作为key,存储了对应context注册的所有的BroadcastReceiver对象。...阶段3:AMS消息队列处理BROADCAST_INTENT_MSG 当AMS所运行线程的消息队列中BROADCAST_INTENT_MSG消息被处理时,AMS从广播调度队列中找到需要接收此广播的广播接收者

    93770

    实验三 音乐播放器

    实验三: 音乐播放器 实验目标和实验内容: 1、掌握服务的基本概念,能编写服务过程并进行调用; 2、掌握广播的基本概念,能实现广播通信。...break; } getActivity().sendBroadcast(intent); } 配置监听到点击时的触发事件 @Override public...BroadcastReceiver接收 sendBroadcast(sendIntent); } } 接收frdFragment的控制信息并对于不同状态下的播放器执行对于不同控制信息的事件...,并发送播放器的状态和歌曲编号给fragment private void prepareAndPlay(String music) { try {...对象,需要设置其actionname; 2.推荐使用显式指明receiver,在配置文件指明; 3.一个receiver可以接收多个action; 4.每次接收广播都会重新生成一个接收广播的对象,

    1.5K20

    自用知识_实用小知识

    发现在editText.setFocusable(false);和editText.setEnabled(false);时不可编辑,但是editText.setFocusable(true);和 editText.setEnabled...=”#00000000″,这个设置可以去除拖动view时背景变成黑色的效果 android:listSelector=”#00000000″ ,可以去除选中时的黄色底色 Style的Diogl样式...:windowIsFloating”>true//对话框是否浮动在Activity上 @null...按返回键还起作用 方法二: setCanceleable(false);调用这个方法时,按对话框以外的地方不起作用。...1、当你是web应用时,比如说要建个网站,需要发布到服务器时,应该要建Web Project 2、当你是做分布式系统时,也就是你做的只是一个服务,对外发布也只是一个服务的时候,需要建立Web Services

    63220

    使用 Intent 启动 Activity和Activity之间的数据传递

    在Android 程序之中,Activity 对象时和用户交互的唯一手段,几乎每个 Android 项目程序都有多个 Activity。因此,灵活的在屏幕上切换 Activity 尤为重要。...当然,我们也可以在创建Intent 对象时不传入要启动的 Activity 对象,即为隐式Intent。...第四行代码设置了 Intent 启动的Activity对象的标志,在这里可以把它看成一种筛选Activity的属性,只有和Intent对象的Action、Data、Category (如果Intent设置了这些属性...null也不为空字符串的时候返回false */ if(!...成功的显示,单击返回后再单击“传送图片数据”按钮: ? good,图片成功的显示,再单击返回后单击“传送自定义数据”按钮: ?

    2.3K10

    Android 四大组件学习之BroadcastReceiver三

    广播分为无序广播和有序广播 无序广播: 广播发送者的action与广播接收者的action都匹配的话,所以广播介绍者都可以收到这条广播,并且没有先后顺序,可以认为是同时收到 有序广播: 广播发送者的action...sendOrderedBroadcast(intent, null, null, null, 0, "每个学生早上7点必须上早操", null); } 然后,就每个接收者做个调整...: 计算机院长把校长的话给改了,校长说计算机要当第一必须6点半起来: public class ComputerPresidentReceiver extends BroadcastReceiver..."); } } 这时候广播到导员了,导员说计算机系必须当第一,6点起来: public class TeacherReceiver extends BroadcastReceiver {...sendOrderedBroadcast(intent, null, new resultReceiver(), null, 0, "每个学生早上7点必须上早操", null); }

    27720

    全局事件-广播(Broadcast)

    什么是广播 广播是Android SDK的四大组件中唯一需要别动接收数据的组件。也就是说对于Activity、ContentProvider和Service都可以主动调用,并获取返回数据。...从这种表现形式上看,很像面向对象中的事件(Event),对于事件(onClick、onKeydown)来说,从来不会预知用户什么时候触发他们,只能默默的等待不可预知的事件发生。...广播的优先级只是对同步处理方式起作用,如果在接收器中使用了异步处理方式,则调用的顺序除了和优先级有关,还和Android系统的线程调用有关。...来电可以分解为3个状态:未接电话时的响铃,接听电话 和挂断电话(可能是对方挂断,也可能是自己挂断) 监听这三个状态的代码如下(使用静态方式注册的广播): CallInReceiver: package...,手机会进入休眠状态(屏幕变黑),当再此按下手机的任意键后,屏幕会唤醒(屏幕变量)。

    1.1K60

    Activity 跳转详解

    (), MyActivity.class) ,参数1 可以使用通用的Context对象,参数2 则是需要跳转到的Activity字节码对象 可以在Intent对象中存放数据 i.putExtra(key...getIntent()方法的特点 我们将显示代码打上断点可以观测到,每次启动时, getIntent() 取得的方法总是 null (注:若你在模拟发送短信前,应用已经关闭,那么会回显示第一次的数据,再次发送短信取得的都是第一次的数据...Activity时的intent */ 光看这个你很难理解到什么叫返回启动时候的intent,本可以最简洁地口头描述给你看,但是这里还是准备用事实说话,我们继续查找名称中带有intent的方法,果然找到个文字叙述比较多且痛快的方法...的 Intent 对象时。...然后是说:当已经有此 Activity 实例存在栈顶时,上面两种情况都会导致 onNewIntent() 方法被调用。 下面两个段落是说: 1.

    63120

    andrioid 桌面

    核心技能部分​ 当拿到Android手机后我们第一眼看到的就是桌面,这个手机桌面和PC机中Windows的桌面类似。桌面上通常用来放置一些常用的程序和功能组件。如图7.1.1所示。...图7.1.2 默认桌面 桌面上显示的图标是可以进行删除和天机的删除桌面组件可以通过以下两步来完成: (1) 在屏幕上长按指定组件,直到桌面下方出现垃圾桶。...(2) 重写WallpaperService的onCreateEngine()方法,该方法返回一个WallpaperService.Engine类的对象。...,所以从本质上看它还是一个广播,因此我们还需要在功能清单文件中使用元素来配置该广播,配置该元素时需要为它指定相应的和元素。...进入该文件夹将会显示此ContentProvider所返回的数据列表。 (3) 依次调用Intent对象的putExtra()方法来设置实时文件夹的图标、标题、显示模式等内容。

    6710

    android 蓝牙开发浅析

    ()方法来搜索蓝牙设备 startDiscovery()方法是一个异步方法,调用后会立即返回。...该方法调用后,搜索过程实际上是在一个System Service中进行的,所以可以调用cancelDiscovery()方法来停止搜索(该方法可以在未执行discovery请求时调用)。...我们可以自己注册相应的BroadcastReceiver来接收响应的广播,以便实现某些功能 // 创建一个接收ACTION_FOUND广播的BroadcastReceiver private final...当两个设备在同一个RFCOMM channel下分别拥有一个连接的BluetoothSocket,这两个设备才可以说是建立了连接。...(UUID用于客户端与服务器端之间的配对) 调用BluetoothServerSocket的accept()方法监听连接请求,如果收到请求,则返回一个BluetoothSocket实例(此方法为block

    54330
    领券