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

为什么我的BroadcastReceiver的onReceive中的intent.getAction()返回null?

BroadcastReceiveronReceive 方法中的 intent.getAction() 返回 null 可能是由于以下几个原因:

基础概念

BroadcastReceiver 是 Android 中的一个组件,用于接收并响应系统广播消息。当注册了某个广播接收器后,当系统发出相应的广播时,该接收器的 onReceive 方法会被调用。intent.getAction() 方法用于获取触发该广播的具体动作(Action)。

可能的原因及解决方法

  1. 未正确设置 Intent Filter 的 Action
    • 原因:在注册 BroadcastReceiver 时,如果没有为 IntentFilter 设置正确的 Action,那么当广播被触发时,intent.getAction() 将返回 null
    • 解决方法:确保在注册 BroadcastReceiver 时设置了正确的 Action。
    • 解决方法:确保在注册 BroadcastReceiver 时设置了正确的 Action。
  • 发送广播时未设置 Action
    • 原因:在发送广播时,如果没有为 Intent 设置 Action,接收到的 Intent 中将没有 Action 信息。
    • 解决方法:确保在发送广播时设置了 Action。
    • 解决方法:确保在发送广播时设置了 Action。
  • 使用 LocalBroadcastManager
    • 原因:如果使用 LocalBroadcastManager 发送和接收本地广播,而未正确设置 Action,也可能导致 intent.getAction() 返回 null
    • 解决方法:确保在使用 LocalBroadcastManager 时设置了正确的 Action。
    • 解决方法:确保在使用 LocalBroadcastManager 时设置了正确的 Action。
  • 动态注册与静态注册的差异
    • 原因:如果是在代码中动态注册的 BroadcastReceiver,确保在发送广播时已经完成了注册。如果是静态注册(在 AndroidManifest.xml 中),确保没有遗漏任何 Action。
    • 解决方法:检查注册时机和方式是否正确。

示例代码

动态注册 BroadcastReceiver

代码语言:txt
复制
public class MainActivity extends AppCompatActivity {
    private BroadcastReceiver myBroadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if ("com.example.MY_CUSTOM_ACTION".equals(action)) {
                // 处理广播
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        IntentFilter filter = new IntentFilter("com.example.MY_CUSTOM_ACTION");
        registerReceiver(myBroadcastReceiver, filter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(myBroadcastReceiver);
    }
}

发送广播

代码语言:txt
复制
Intent intent = new Intent("com.example.MY_CUSTOM_ACTION");
sendBroadcast(intent);

通过以上步骤,可以确保 BroadcastReceiver 能够正确接收到广播并获取到相应的 Action。如果问题依然存在,建议检查是否有其他因素干扰了广播的接收过程,例如权限设置或系统限制。

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

相关·内容

Android 广播机制(Broadcast)介绍与使用

接收广播 创建广播接收器,调用onReceive()方法,需要一个继承BroadcastReceiver的类。 注册广播 代码中注册称为动态注册。...动态注册的刚波接收器一定要取消注册。在onDestroy()方法中调用unregisterReceiver()方法来取消注册。 不要在onReceive()方法中添加过多的逻辑操作或耗时的操作。...因为在广播接收器中不允许开启线程,当onReceive()方法运行较长时间而没结束时,程序会报错。因此广播接收器一般用来打开其他组件,比如创建一条状态栏通知或启动一个服务。...sendOrderedBroadcast(intent, null); Log.d(TAG, "[App1] 发送不带权限的有序广播, " + intent.getAction()); } 发送方...可以把本地广播看成是一个局部的,App内的广播体系。 实验中我们注意到,Intent.ACTION_TIME_TICK广播是可以截断的。

3.1K30
  • Android必知必会的四大组件--Broadcast Receiver

    前言 广播,在我们的应用中起着一个非常重要的角色。就比如说我们经常使用的Intent、IntentFilter,就有着广播的作用。 在我的 helper 项目中就集成了网络广播的动态注册。...对于不同注册方式的广播接收器回调OnReceive(Context context,Intent intent)中的context返回值是不一样的: 对于静态注册(全局+应用内广播),回调onReceive...(context, intent)中的context返回值是:ReceiverRestrictedContext; 对于全局广播的动态注册,回调onReceive(context, intent)中的context...返回值是:Activity Context; 对于应用内广播的动态注册(LocalBroadcastManager方式),回调onReceive(context, intent)中的context返回值是...对于应用内广播的动态注册(非LocalBroadcastManager方式),回调onReceive(context, intent)中的context返回值是:Activity Context;

    71840

    监听Android中的网络变化

    一、创建广播接收器 首先,我们需要创建一个广播接收器(BroadcastReceiver),用于接收系统发出的网络变化广播。在本例中,我们创建了一个名为ConnectReceiver的广播接收器。...if (intent == null || intent.getAction() == null) return;...", e); } } }); } 在onReceive()方法中,我们首先判断收到的广播是否是我们关心的网络变化广播。...首先,创建一个广播接收器(BroadcastReceiver)来接收系统发出的网络变化广播。然后,在代码中动态注册广播接收器,并设置监听的网络变化广播。...当网络发生变化时,系统会发出相应的广播,广播接收器将接收到这些广播并调用onReceive()方法,在这个方法中可以处理网络变化。

    31310

    安卓基础干货(七):安卓广播的学习

    为什么需要广播接受者 广播: 1、电台:发送一定频道的广播消息,50mhz; 2、收音机:调整到一定频道,接收广播消息; android应用程序里面的电台:系统内置的一个服务,会把事件(电量不足、电量充满...,系统会自动启动广播接收者的进程,调用onReceive方法,接收消息。...", 0).show(); } } } 广播接受者案例_开机启动(重点) 步骤: 1、买个收音机 2、插上电池 3、调整到一个频道 要做的事情:让软件开启后关闭不了: 禁用返回键和最小化键...//initialExtras 指定额外的参数 sendOrderedBroadcast(intent, null, null, null, 1, "国务院开始发放2014年农田补贴:900元", null...(context, "我是省级人民政府,已经接收到了中央发的消息:"+info, 0).show(); setResultData("国务院开始发放2014年农田补贴:400元"); 补间动画 /**

    4K10

    Android 监听安装和卸载

    Android 应用程序的安装和卸载事件,是由系统进行监听并全局广播的,支持1.5(android 3)以上 因此,如果想要监听获取应用的安装和卸载事件,只需要自定义一个BroadcastReceiver...,来对系统广播进行监听和处理 BroadcastReceiver 是系统全局广播监听类, 其主要方法是onReceive(),自定义的广播类继承于它并实现自己的onReceive()处理逻辑 BroadcastReceiver...使用前,需要进行注册监听(xml和代码两种方式),不使用时需要注销监听,其生命周期一般为整个应用的生命周期 1, 自定义广播 自定义广播MyInstalledReceiver继承自BroadcastReceiver...,实现其onReceive()方式,具体代码如下: public class MyInstalledReceiver extends BroadcastReceiver { @Override public...void onReceive(Context context, Intent intent) { if (intent.getAction().equals("android.intent.action.PACKAGE_ADDED

    2.3K30

    Broadcasts详解「建议收藏」

    然而,一旦你的代码从onReceive()返回,BroadcastReceiver就不再active。...因此,您不应该在BroadcastReceiver中启动长时间运行的后台线程。onReceive()执行完后,系统可能杀死进程以随时回收内存,并终止运行在这个进程中的线程。...下面的代码显示了一个BroadcastReceiver使用goAsync()标志onReceive()返回后,它需要更多的时间来处理广播。...6、 因为一个接收器的onReceive(Context, Intent)方法在主线程上运行,它应该快速执行并返回。...这会让Receiver在onReceive()返回后保持Active。然而,即使采用这种方法,系统也希望您能在10秒内完成广播。它允许你把工作移动到另一个线程中,避免阻塞主线程。

    83610

    Android蓝牙详析 | 蓝牙的适配、权限、开启、搜索发现等处理

    本系列笔记概述 蓝牙传输优势:功耗低,传输距离还可以; 蓝牙聊天室案例 Android中蓝牙设备的使用 蓝牙权限(本文的讲解内容之一) 蓝牙功能开启(本文的讲解内容之一) 搜索蓝牙设备(本文的讲解内容之一...对象与之交互; 如果getDefaultAdapter()返回null,则表示该设备不支持蓝牙, 例如: BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter...new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent...mBluetoothReceiver = new BroadcastReceiver() { @Override public void onReceive(Context...mBluetoothReceiver = new BroadcastReceiver() { @Override public void onReceive(Context

    6.6K30

    为APP添加一个登录刷新已打开UI机制

    为你的APP添加一个统一刷新事件 最近看到一个朋友的博客,写了一篇文章 控制页面刷新小技巧 ---- 我觉得我的想法与他的有很大的出入,这里写写我自己的控制刷新事件吧 首先 拿我最近的项目做做例子吧...,我注册广播使用的是 V4包的,这样的话,这个广播,只在本进程内有效 LocalBroadcastManager.getInstance(this).registerReceiver(recever...,null); ---- 6.关键代码来了,以上我们定义了一个统一的界面BaseActivity 一个用于执行动作的广播 LoginRecever 一个统一需要操作界面的接口 UIDataDelegate...= null && intent.getAction() != null && intent.getAction().equals(ACTION) && uiDataInterface !...这里使用了软引用,可以避免你的activity回收不了的情况 ---- 大功告成 ! ---- 没图我说个J8?? ? 输入图片说明

    31950

    在 React 16 中从 setState 返回 null 的妙用

    概述 在 React 16 中为了防止不必要的 DOM 更新,允许你决定是否让 .setState 更来新状态。在调用 .setState 时返回 null 将不再触发更新。...React 16 对状态性能进行了改进,如果新的状态值与其现有值相同的话,通过在 setState 中返回 null 来防止来触发更新。 ?...我在下面的两个 GIF 中突出显示了 React DevTools 中的更新: ? 没有从 setState 返回 null ?...从 setState 返回 null 之后 注意:我在这里换了一个深色主题,以便更容易观察到 React DOM 中的更新。...总结 本文介绍了在 React 16 中怎样从 setState 返回 null。我在下面的 CodeSandbox 中添加了 mocktail 选择程序的完整代码,供你使用和 fork。

    14.6K20
    领券