Android Studio实现html点击按钮发送请求广播,并动态注册实现广播接收者,接收到广播后显示一个TOAST

Android中对于广播接受者
为什么动态注册优先级高于静态注册? - 知乎32被浏览<strong class="NumberBoard-itemValue" title="分享邀请回答private void scanDirLI(File dir, int parseFlags, int scanFlags, long currentTime) {
final File[] files = dir.listFiles();
可以看到,对于不同目录下的APK,一般系统app先响应;对于同一个目录下的app(比如都是用户安装app)处理的顺序是listFiles结果的顺序!------------------------------------------------------------------------------------------回到原问题,为什么动态优先于静态?因为代码就是这么写的。这时候就应该上源代码,在ActivityManagerService的broadcastIntentLocked函数里面,看我注释: // 静态广播接收器list
List receivers = null;
// 动态广播接收器List
List&BroadcastFilter& registeredReceivers = null;
// 获取静态广播接收器mReceivers
// 主要是初始化上面两个List,静态广播从PMS里面拿到,动态广播从AMS拿到
// 如果接收到的广播 是普通广播。
if (!ordered && NR & 0) {
// If we are not serializing this broadcast, then send the
// registered receivers separately so they don't wait for the
// components to be launched.
BroadcastRecord r = new BroadcastRecord(intent, callerApp,
callerPackage, callingPid, callingUid, requiredPermission,
registeredReceivers, resultTo, resultCode, resultData, map,
ordered, sticky, false);
// 很明显接收到普通广播之后,在这只处理了动态广播 registeredReceivers,
// 对于普通广播而言,动态广播接收器要优先于静态广播接收器 无关设置的优先级
boolean replaced = false;
if (replacePending) {
for (int i=mParallelBroadcasts.size()-1; i&=0; i--) {
if (intent.filterEquals(mParallelBroadcasts.get(i).intent)) {
if (DEBUG_BROADCAST) Slog.v(TAG,
"***** DROPPING PARALLEL: " + intent);
mParallelBroadcasts.set(i, r);
replaced = true;
if (!replaced) {
mParallelBroadcasts.add(r);
scheduleBroadcastsLocked();
//将registeredReceivers置为null,后面只处理静态广播接收器,所以不会有冲突。
registeredReceivers = null;
// 如果是有序广播,将静态广播接收器和动态广播接收器组合成一个最终的顺序
int ir = 0;
if (receivers != null) {
//合并的过程,注意顺序
int NT = receivers != null ? receivers.size() : 0;
int it = 0;
ResolveInfo curt = null;
BroadcastFilter curr = null;
while (it & NT && ir & NR) {
if (curt == null) {
curt = (ResolveInfo)receivers.get(it);
if (curr == null) {
curr = registeredReceivers.get(ir);
// 如果动态广播接收器优先级高于或者等于静态广播接收器,那么就插到前面
// 很明显动态的要在静态的前面
if (curr.getPriority() &= curt.priority) {
// Insert this broadcast record into the final list.
receivers.add(it, curr);
curr = null;
// Skip to the next ResolveInfo in the final list.
curt = null;
52 条评论分享收藏感谢收起2添加评论分享收藏感谢收起写回答Android 动态注册广播接收器
&从本质来说, 的广播机制是一种消息订阅/发布机制,因此,使用这种消息驱动模型的第一步便是订阅消息;而对 Android 应用程序来说,订阅消息其实就是注册广播接收器。
&&& 注册的方法有两种,一种是静态注册,一种是动态注册。在 Android 的广播机制中,动态注册的优先级是要高于静态注册优先级的,因此在必要的情况下,我们是需要动态注册广播接收器的。
&&& 先回顾一下静态注册。所谓注册,就是在 Manifest.xml 中去注册广播接收器。
&receiver android:name=&& &&
&&&&&&&&&& &intent-filter android:priority=&& &&
&&&&&&&&&&&&&& &action android:name=&android.provider.Telephony.SMS_RECEIVED& &&
&&&&&&&&&&&&&& &/action&&
&&&&&&&&&& &/intent-filter&&
&&&&&& &/receiver&&
&&& 然后再创建一个继承 BroadcastReceiver 得类即可。在这里要特意强调一下的是,intent-filter 标签中的 priority 是设置广播接收器的优先级,网上很多资料都表示,优先级的设置数值为,1000最大,但事实上,当 priority 值为integer 的最大值才时,才是优先级最高的,即& ;当然,&最高&只是限于静态注册。
&&& 了解更多关于静态注册信息,可参考《【Android】短信应用&&短信信息实时获取》&一文,其短信信息的获取就是运用了广播接收器的静态注册。
&&& 下面回到正题,如何动态注册广播接收器。
&&& 首先,我们来写一个内部类,继承 BroadcastReceiver。
private BroadcastReceiver myReceiver = new BroadcastReceiver() {&
&&&&&&& @Override&
&&&&&&& public void onReceive(Context context, Intent intent) {&
&&&&&&&&&&& Toast.makeText(context, &myReceiver receive&, Toast.LENGTH_SHORT)&
&&&&&&&&&&&&&&&&&&& .show();&
&&&&&&& }&
&&& onReveice 中我们写一个 Toast,稍后用来检测广播接收器是否成功注册。
&&& 下面来看看如何去注册广播接收器。
private static final String ACTION = &cn.etzmico.broadcastreceiverregister.SENDBROADCAST&;&
IntentFilter filter = new IntentFilter();&
&&&&&&&&&&&&&&& filter.addAction(ACTION);&
&&&&&&&&&&&&&&& filter.setPriority(Integer.MAX_VALUE);&
&&&&&&&&&&&&&&& registerReceiver(myReceiver, filter);&
&&& 我们在注册的时候也来设置下优先级,正如上面文章提到的,用 Integer& 的最大值来获得广播机制中的最高优先级。
&&& 广播注册完毕,下面就是来做测试,来检验广播接收器是否注册个成功。
sendBroadcast(new Intent(ACTION));&
&&& 动态注册广播接收器还有一个特点,就是当用来注册的 Activity 关掉后,广播也就失效了。同时反映了静态注册的一个优势,就是无需担忧广播接收器是否被关闭,只要设备是开启状态,广播接收器就是打开着的。
&&& 不过,我们可以通过将广播接收器在 Service 中动态注册,并设置开机自启动,这样一来,就不会担心像Activity一样的关闭问题了。但又如果要用&自启动管家&等带有管理开机自启动程序功能的软件讲相关自启动程序关闭时,广播接收器也就无法成功注册了。要想解决这个问题,就要看,是否能防止程序的自启动被关闭。另外,现市场上有没有程序能通过管理广播接收器来关闭静态注册的广播接收器,我还在调研,目前没有发现,如果有知道的,欢迎留言说明~谢谢!
&&& 后续的文章我会写一篇关于通过动态注册广播接收器方法来实现有最高优先级的短信拦截功能的文章。文章中会提到如何开机自启动 Service 和 用 Service 动态注册广播接收器,敬请关注!谢谢~
PS:之前附加的资源有一个小BUG,给大家带来了不便,不好意思!!!下面的链接是新上传的&&没BUG的&&I promise!&
摘自& Etzmico&没有更多推荐了,
不良信息举报
举报内容:
android_广播者_只能用代码注册(动态注册)的广播接收者_监听屏幕的状态
举报原因:
原文地址:
原因补充:
最多只允许输入30个字
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!Android广播接收短信的简单实现
说明: 接受短信广播,由Intent解析出短信内容明文, intent中的短信时已pud形式传出的,即byte[][]二位数组,
需要转化出明文SmsMessage.createFromPdu(pdus[i])
广播接收器:
public class SmsReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
if (intent != null && intent.getAction() != null) {
if (intent.getAction().equals(Intents.SMS_RECEIVED_ACTION)) {
SmsMessage[] msgs = getMessagesFromIntent(intent);
// to use this SmsMessage
String messageBody = &&;
for (SmsMessage message : messages) {
messageBody += message.getMessageBody();
Log.i(&MSG&, messageBody);
* Read the PDUs out of an {@link #SMS_RECEIVED_ACTION} or a
* {@link #DATA_SMS_RECEIVED_ACTION} intent.
* @param intent
* the intent to read from
* @return an array of SmsMessages for the PDUs
public static final SmsMessage[] getMessagesFromIntent(Intent intent) {
Object[] messages = (Object[]) intent
.getSerializableExtra(&pdus&);
if (messages == null) {
byte[][] pduObjs = new byte[messages.length][];
for (int i = 0; i & messages. i++) {
pduObjs[i] = (byte[]) messages[i];
byte[][] pdus = new byte[pduObjs.length][];
int pduCount = pdus.
SmsMessage[] msgs = new SmsMessage[pduCount];
for (int i = 0; i & pduC i++) {
pdus[i] = pduObjs[i];
msgs[i] = SmsMessage.createFromPdu(pdus[i]); //解析每一段pdu字节数组,返回解码明文
注意: manifest中声明权限:
//接收短信必须的权限
//读短信权限
//写系统短信权限没有更多推荐了,
不良信息举报
举报内容:
Broadcast receiver 动态注册 & 作为内部类接收广播 详解
举报原因:
原文地址:
原因补充:
最多只允许输入30个字
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!}

我要回帖

更多关于 html点击按钮发送请求 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信