接收广播系统 1.新建一个项目BroadcastTest 2.修改MainActivity: package com.example.broadcasttest; import android.content.BroadcastReceiver
比较重要的一个广播事件,短信 界面布局,比如播放视频,默认是横屏全屏的,清单文件中进行设置, 在<activity/>节点设置屏幕朝向属性,android:screenOrientation=”landscape getMessageBody()方法,得到短信内容 调用SmsMessage对象的getOriginatingAddress()方法,得到发件人 调用abortBroadcast()方法,直接终止掉这条广播 清单文件中intent-filter节点上,可以设置优先级属性,android:priority=”1000” 广播接收者的优先级,-1000优先级最低,1000优先级最高
个人网站、项目部署、开发环境、游戏服务器、图床、渲染训练等免费搭建教程,多款云服务器20元起。
IIntentReceiver其实是一个AIDL接口,内部就一个方法performReceive(…); mPackageInfo:ContextImpl导入的一个LoadedApk的实例,是用来处理广播接收的 registered); 而通过以上rd.getIIntetReceiver可以看出rd就是InnerReceiver对象,也就是binder对象 在新建广播接收发布器ReceiverDispatcher ,粘性广播的Receiver如果被销毁,那么下次重建时会自动接收到消息数据. ,快速找到对应的广播接收器的。 最后将BroadcastFilter添加到IntentResolver类型的mReceiverResolver中,这样当AMS接收到广播时,就可以从mReceiverResolver中直接找到对应的广播接收者
接下来,我们继续分析Android应用程序是如何注册广播接收器的,以及把广播接收器注册到哪里去的。 因此,Android应用程序注册广播接收器的过程就是把广播接收器注册到AMS的过程。 我们先看一下这几个参数,receiver表示用户注册广播接收器;userId注册广播应用程序的userID;filter为广播接收器的接收条件;broadcastPermission广播接收器的权限信息 ,广播发送者必须带上这个权限信息,它所发出的广播才能被注册者接收到;scheduler表示接收广播的线程的Handler。 ,里面的receivers成员存储了需要接收当前广播的所有接收器。
类继承系统的Service类 添加一个自定义的服务的方法callServiceMethod(),我们目的要调用的方法 新建一个内部类MyReceiver继承系统的Receiver类 广播接收者既能通过清单文件注册 ,也可以通过代码的方式注册,这是四大组件中唯一的特殊的一个 在MyService中创建一个MyReceiver的成员变量 在服务创建的时候,注册广播接收者,在onCreate()方法里面 调用registerReceiver (receiver,filter)方法,注册这个广播接收者,参数:receiver是BroadcastReceiver对象,通过new MyReceiver()来创建,filter是IntentFilter 会调用MyReceiver对象的onReceive()方法,在这个方法里面可以去调用服务的私有方法,比如callServiceMethod() 当服务销毁的时候,解除注册的广播接收者,在onDestroy ()方法里面,调用unResisterReceiver(receiver),参数:广播接收者对象 MainActivity.java package com.tsh.broadcallservice;
广播的注册过程(动态注册) ? 1)静态注册在应用安装时由PackageManagerService来完成注册过程 2)IIntentReceiver是一个Binder接口,用于广播的跨进程的通信,它在LoadedApk.ReceiverDispatcher.InnerReceiver 中实现 3)注册广播是一个跨进程过程,需要具有跨进程的通信功能的IIntentReceiver 4)粘性广播是存储在AMS中的 5)ReceiverList继承自ArrayList,用来存储广播接收者 6)AMS接收到广播时就可以从mReceiverResolver中找到对应的广播接收者了,从而达到了注册广播的目的 二。 广播的发送和接收过程 第一步。ContextImpl到AMS的调用过程 ? 第二步。AMS到BroadcastReceiver的调用过程 ?
Android提供了一整套完整的API,允许应用程序自由地发送和接收广播。发送广播就是借助之前了解过的Intent,接收广播则需要用到广播接收器(Broadcast Receiver)。. 1、广播的类型 标准广播:Normal broadcast,是一种完全异步执行的广播,在广播发出之后,所有的广播接收器几乎都会在同一时刻接收到这条广播消息,因此他们之间没有任何先后顺序可言。 有序广播:Ordered broadcast,是一种同步执行的广播,在广播发出之后,同一时刻只会有一个广播接收器能够接收到这条广播,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递。 所以此时的广播接收器是有顺序的,优先级高的广播接收器可以先接受到广播消息,并且前面的广播接收器还可以截断正在传递的广播,这样后面的广播接收器就无法收到广播消息了。 3、广播接收器的注册 广播接收器可以自由地对自己感兴趣的广播进行注册,这样才能在有相应的广播发出时,广播接收器就能够收到该广播,并在内部进行相应的逻辑处理。
接下来我们需要借助 Laravel Echo Server 搭建起 Websocket 服务器,这里面除了封装 Socket.io 服务端之外,还包含了订阅服务端广播频道的 Redis 客户端,用于接收服务端 Redis 发布的消息,再通过 Socket.io 广播给客户端。 至此,我们就将前面基于 Redis + Socket.io 原生代码实现的事件广播功能重构为了基于 Laravel 广播组件 + Laravel Echo Server + Laravel Echo 实现的完整广播系统了 ,这样一来,我们就可以使用 Laravel 广播系统提供的所有功能了,包括事件广播的推送和接收、私有频道、存在频道等。 这个时候,查看 laravel-echo-server 的日志,就可以看到服务端发布的事件消息已经被 Laravel Echo Server 中的 Redis 接收处理了: ?
3、使用场景: ①当手机没有电时,会告知用户“电量低”的广播信息。可以做到正在使用的app就会接收到这个广播消息,如果是游戏可能是提醒保存数据,如果是正在使用的工作软件,可能提醒接上电源。 4、一个程序发出广播信息,一个程序接收广播信息,所以至少需要2个程序才能完成一发一收。发的一方,叫广播发送方;收的一方,叫广播接收者。 5、广播接受者需要进行注册。 方法,如果执行,代表已经接收到广播 ④定义收到信息广播接收者,属于系统广播,则需要申请权限(静态,动态) 【项目结构】 ? 【小结】 ①这里是接收系统广播,也可以自己定义广播。以及可以添加很多功能,接收到广播进行特定的操作。 ②广播必须添加过滤器,对特定的广播进行接收 ③如果是接收系统广播要进行权限的申请,5.0之后一定要进行动态权限申请才可以 以上就是本文的全部内容,希望对大家的学习有所帮助。
但是我在这一过 程中发生了一个低级错误,我向广播发送两种 Action 类型的 Intent,结果始终接收不到,或者只能接收到一个 Intent 信息 预测效果: 进度条 但是实际: 进度条满了之后无法关闭 : ---- 进过排查后我发现了问题所在: 在广播注册的地方,我只为 Receiver 添加了修改进度条的 Action ,而没有添加打开、关闭窗口的 Action: private fun
使用广播接收者接收打电话的意图,显示号码归属地 新建一个类OutCallReceiver继承系统的BroadcastReceiver 重写onReceive()方法 调用getResultData()方法 import android.content.Context; import android.content.Intent; import android.widget.Toast; /** * 接收打电话广播 :name=”android.intent.action.NEW_OUTGOING_CALL” 需要权限,android.permission.PROCESS_OUTGOING_CALLS 代码注册广播 此时的广播接收者,只要一打电话就会被调用,用户体验不好,我们使用代码注册广播接收者,用设置中心的开启监听电话来电的部分来控制这个广播 在服务里面调用registerReceiver()方法,注册广播, 获取IntentFilter对象,调用IntentFilter对象的addAction()方法,参数:android.intent.action.NEW_OUTGOING_CALL 在服务里面解除注册广播
(文末附项目git) 这篇文章主要介绍了SpringBoot webSocket实现发送广播、点对点消息和Android接收,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。 接收广播实例: ? ? ? ? ? ? ? 点对点 ? ? ? ? ? ? 代码比较乱,说明一下。 例如发广播消息,路径为/app/welcome 例如发点对点消息,路径为/app/cheat 4、消息订阅路径 订阅broker源自WebSocketConfig中的registry.enableSimpleBroker
这是发,一定还有接收的code。 导包 这就是监听的代码,为什么是监听?其实上面的程序是无指向的乱发,只有感兴趣的才会收这个东西。
今天博主带给小伙伴们一个小功能,就是利用广播接收器实现自动填充短信验证码,话不多说,我们先看看如何去实现这个小功能。 首先我们需要新建一个名为SMSBroadcastReceiver的广播接收器,代码如下: public class SMSBroadcastReceiver extends BroadcastReceiver { System.out.println(m.group()); return m.group(0); } return null; } } 至此我们短信的广播接收器就完成了 之后我们需要完成注册广播接收器以及填写验证码的代码,完成代码如下: private void initSmsReader(){ public static final String SMS_RECEIVED_ACTION (); //实例化过滤器并设置要过滤的广播 IntentFilter intentFilter = new IntentFilter(SMS_RECEIVED_ACTION);
4.0 接收广播需要创建广播接收器。 表 4.2:广播接收器的类型定义: 类型 定义 私有 只能接收来自相同应用的广播的广播接收器,所以是最安全的 公共 可以接收来自未指定的大量应用的广播的广播接收器 内部 只能接收来自其他内部应用的广播的广播接收器 4.2.1.1 私有广播接收器 私人广播接收器是最安全的广播接收器,因为只能接收到从应用内发送的广播。 动态广播接收器不能注册为私有,所以私有广播接收器只包含静态广播接收器。 公共广播接收器是可以从未指定的大量应用程序接收广播的广播接收器,因此有必要注意,它可能从恶意软件接收广播。
: 类型 特性 普通 普通广播发送到可接收的广播接收器时消失。 广播由多个广播接收器同时接收。 这与有序广播有所不同。 广播被允许由特定的广播接收机接收。 有序 有序广播的特点是,可接收的广播接收器依次接收广播。 优先级较高的广播接收器较早收到。 当广播被传送到所有广播接收器或广播接收器调用abortBroadcast(),广播将消失。 广播被允许由声明了特定权限的广播接收器接收。 另外,广播接收器发送的结果信息,可以由发送者使用有序广播接收。 SMS 接收通知的广播(SMS_RECEIVED)是有序广播的代表性示例。 广播的特征行为 普通 有序 粘性 粘性有序 由权限限制的广播接收器可以接收广播 OK OK - - 从广播接收器获得过程结果 - OK - OK 使广播接收器按顺序处理广播 - OK - OK 稍后收到已经发送的广播
1、描述广播接收者 BroadCastReceiver是安卓中四大组件之一,主要用于接收系统或者APP发送的广播事件。 缺点是一个接受者不能将处理结果传递给下一个接受者,并且无法终止广播。 有序广播:按照被接收者的优先级别,在被接收者中依次传播。 如果比他优先级高的广播接收者中断了广播,那么它一样可以接收到广播。 静态注册的广播接受者只要APP在系统中运行,则一直可以接收到广播,动态注册的广播接受者当注册的Activity或者Service摧毁的时候那么就接收不到广播了。 a.广播接收者生命周期短暂,在接收到广播的时候创建,onReceive方法结束后销毁 b.广播接收者中不要做耗时的操作,否则会弹出ANR错误对话框 c.最好也不要在广播接收者中创建子线程做耗时的工作
介绍 BroadcastReceiver 是 Android 的四大组件之一,它作用于应用内、进程间重要的一种通信方式,能够将某个消息通过广播的形式传递给订阅的广播接收器中,下面我们就来分析一下 广播注册到接收到消息 ContextImpl 的 registerReceiverInternal 这个函数,这里的成员变量 mPackageInfo 是一个 LoadApk 实例,它是用来负责处理广播的接收。 注释 4 只是把广播接收器保存起来,但是还没有和 filter 关联起来,这里就创建一个 BroadcastFilter 来把广播接收器列表 rl 和 filter 关联起来,然后保存在 AMS 成员变量 mReceiverResolver 中,这样,就将广播接收器和要接收广播类型的接收器 filter 保存在 AMS 中了,以后就能接到到相应的广播并做处理了。 onReceive 时序图 在 Activity 通过 sendBroadcast 发送一个广播最后 Binder 发送给 AMS , AMS 根据这个广播的 Action 类型找到相应的广播接收器,
由于公共广播接收器从未指定的大量应用接收意图,它可能会收到恶意软件的攻击意图。 私有广播接收器将永远不会直接从其他应用接收任何意图,但公共组件从其他应用接收的意图数据,可能会转发到私有广播接收器。 对于广播敏感信息,只有可靠的广播接收器可以接收它,而其他广播接收器则不能。 以下是广播发送方法的一些示例。 方法是,通过使用显式意图,将广播仅仅发送给预期的可靠广播接收器,来固定地址。 另一方面,粘性广播(以下粘性广播包括粘性有序广播)即使由可用的广播接收器接收也不会从系统中消失,并且能够由registerReceiver()接收。 有序广播用于接收来自接收器的返回信息,并使几个接收器逐一执行处理。 广播按优先顺序发送给接收器。 当发送方(源)广播接收器是公共广播接收器时,它从未指定的大量应用接收返回数据。 所以它也可能会收到恶意软件的攻击数据。 当发送方(源)广播接收器是私有广播接收者时,似乎没有风险。
扫码关注腾讯云开发者
领取腾讯云代金券