Android 中的广播机制
创始人
2024-03-26 17:50:50
0

一、Android广播概念:

在Android中,有一些操作完成以后,会发送广播,Android系统内部产生这些事件后广播这些事件,至于广播接收对象是否关心这些事件,以及它们如何处理这些事件,都由广播接收对象自己决定。

二、发送全局广播:

  • 发送广播有两种类型:
    • 标准广播
    • 有序广播

1.标准广播:

完全异步执行的广播,发出广播后,所有的广播接收器几乎会在同一时刻收到这条广播通知。

//点击按钮发送广播
btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {//第一步:将需要广播的消息封装到Intent中Intent intent = new Intent();intent.putExtra("name","张三");//第二步:自定义广播频段,表示该条广播会在那个频段下发出intent.setAction("my.broadcast.key");//第三步:调用Context的sendBroadcast()方法将广播发送出去;sendBroadcast(intent);}
});

2.有序广播:

同步执行的一种广播,同一时刻只有一个广播接收器能收到,这个广播接受者的逻辑执行完后,才会传递到下一广播接受者。
在这里插入图片描述

//点击按钮发送广播
btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {//第一步:将需要广播的消息封装到Intent中Intent intent = new Intent();intent.putExtra("name","张三");//第二步:自定义广播频段,表示该条广播会在那个频段下发出intent.setAction("my.broadcast.key");//第三步:调用Context的sendOrderedBroadcast()方法将广播发送出去;//第二个参数是权限参数,如果为null则表示不要求接收者声明指定的权限,如果不为null,则表示接收者若要接收此广播,需声明指定权限。sendOrderedBroadcast(intent,null);}
});
/*
1.优先接收到广播的Broadcastreceiver广播接收者可以通过setResultExtras(Bundle)方法将一个Bundle对象设置为结果集对象,传给下一个接收者。
2.下一个接收者通过getResultExtras()可以获取上一个接收者存入的数据
3.中断广播,拦截一条广播不往下发送abortBroadcast()
*/

三、接收全局广播:

为了监听这些广播事件,Android提供了一个BroadcastReceiver全局监听器组件,该组件可以监听来自系统或应用程序的广播。

1.运行机制:

当系统或其他应用程序发送广播时,所有已经注册的 BroadcastReceiver 的应用程序就会检查注册时的IntentFilter里的Action是否与发送广播时的Intent的Action相匹配,若匹配则会调用BroadcastReceiver的onReceive()方法进行处理,所以主要工作是对BroadcastReceiver里的onReceive()方法的实现。

2.步骤:

第一步:创建一个类继承BroadcastReceiver,实现onReceive()方法

package com.example.myapplication;import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;public class MyReceiver extends BroadcastReceiver {//检测到广播后会自动回调onReceive方法@Overridepublic void onReceive(Context context, Intent intent) {Toast.makeText(context, "检测到广播", Toast.LENGTH_LONG).show();}
}

第二步:注册BroadcastReceiver

  • 动态注册:
//1.构建IntentFilter标签,设置其Action属性
IntentFilter filter = new IntentFilter();
//2.Action属性指定接收来自哪个频段的广播
filter.addAction("my.broadcast.key");
//3.将IntentFilter装入广播接收器中
MyReceiver receiver = new MyReceiver();
//4.注册广播接收器
registerReceiver(receiver, filter);
  • 静态注册:



3.BroadcastReceiver生命周期:

每次广播事件发生后,系统就会创建对应的BroadcastReceiver实例对象,并自动触发它的onReceive()方法,onReceive()方法执行完后,BroadcastReceiver的实例对象就会被销毁。

四、本地广播:

前面接触的广播都是全局广播,这同样意味着我们APP发出的广播,其他APP都会接收到,但是部分广播我们不希望其他APP捕获。
Android中给我们提供了本地广播 LocalBroadcastManager 的机制,使用该机制发出的广播只会在APP内部传播,而且广播接收者也只能收到本应用发出的广播。

1.实现只在本应用内发送广播:

发送广播的具体步骤同(二)

第一步:获取LocalBroadcastManager的实例对象

LocalBroadcastManager localBManager = LocalBroadcastManager.getInstance( this ) ;

第二步:调用LocalBroadcastManager对象的sendBroadcast()发送广播

localBroadcastManager.sendBroadcast(intent);

2.实现只接收本应用内的广播:

接收广播的具体步骤同(三)

第一步:获取LocalBroadcastManager的实例对象

LocalBroadcastManager localBManager = LocalBroadcastManager.getInstance( this ) ;

第二步:通过LocalBroadcastManager对象的registerReceiver()注册广播

localBManager. registerReceiver(localReceiver, intentFilter);

五、案例:广播的接收和发送

注:其实这部分内容我也没有太深入的理解,主要是根据这个简单的案例写的文章。

MyReceiver.java:

package com.example.myapplication;import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;public class MyReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {Toast.makeText(context, "检测到广播,广播内存有数据:"+intent.getStringExtra("name"), Toast.LENGTH_LONG).show();}
}

MainActivity.java:

package com.example.myapplication;import android.content.IntentFilter;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.content.Intent;
import android.view.View;
import android.widget.Button;public class MainActivity extends Activity {@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button btn = findViewById(R.id.btn);//点击按钮发送广播btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {//第一步:将需要广播的消息封装到Intent中Intent intent = new Intent();intent.putExtra("name","张三");//第二步:自定义广播频段,表示该条广播会在那个频段下发出intent.setAction("my.broadcast.key");//第三步:调用Context的sendOrderedBroadcast()方法将广播发送出去;//第二个参数是权限参数,如果为null则表示不要求接收者声明指定的权限,如果不为null,则表示接收者若要接收此广播,需声明指定权限。sendBroadcast(intent);}});//构建IntentFilter标签,设置其Action属性IntentFilter filter = new IntentFilter();//Action属性指定接收来自哪个频段的广播filter.addAction("my.broadcast.key");//将IntentFilter装入广播接收器中MyReceiver receiver = new MyReceiver();//注册广播接收器registerReceiver(receiver, filter);}
}

效果:

点击按钮发送全局标准广播,并被本应用捕获。
在这里插入图片描述

相关内容

热门资讯

AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
月入8000+的steam搬砖... 大家好,我是阿阳 今天要给大家介绍的是 steam 游戏搬砖项目,目前...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...