Android四大组件之广播BroadcastReceiver详解
作者:tea_year 发布时间:2023-03-29 23:41:14
定义
BroadcastReceiver,“广播接收者”的意思,顾名思义,它就是用来接收来自系统和应用中的广播。在Android系统中,广播体现在方方面面,例如当开机完成后系统会产生一条广播,接收到这条广播就能实现开机启动服务的功能;当网络状态改变时系统会产生一条广播,接收到这条广播就能及时地做出提示和保存数据等操作;当电池电量改变时,系统会产生一条广播,接收到这条广播就能在电量低时告知用户及时保存进度等等。Android中的广播机制设计的非常出色,很多事情原本需要开发者亲自操作的,现在只需等待广播告知自己就可以了,大大减少了开发的工作量和开发周期。而作为应用开发者,就需要数练掌握Android系统提供的一个开发利器,那就是BroadcastReceiver。
在我们详细分析创建BroadcastReceiver的两种注册方式前,我们先罗列本次分析的大纲:
(1)对静态和动态两种注册方式进行概念阐述以及演示实现步骤
(2)简述两种BroadcastReceiver的类型(为后续注册方式的对比做准备)
(3)在默认广播类型下设置优先级和无优先级情况下两种注册方式的比较
(4)在有序广播类型下两种注册方式的比较
(5)通过接受打电话的广播,在程序(Activity)运行时和终止运行时,对两种注册方式的比较
(6)总结两种方式的特点
一、静态和动态注册方式
? 构建Intent,使用sendBroadcast方法发出广播定义一个广播 * ,该广播 * 继承BroadcastReceiver,并且覆盖onReceive()方法来响应事件注册该广播 * ,我们可以在代码中注册(动态注册),也可以AndroidManifest.xml配置文件中注册(静态注册)。
案例解析:
1.主界面设计
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:id="@+id/btnSend"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:insetTop="16dp"
android:text="发松" />
</LinearLayout>
如图:
2.后台代码设计
package com.aaa.btdemo02;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
//定义对象;村长:一样权威,光辉的存在,拿着大喇叭,讲话;
Button btnSend;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); //取值
btnSend=(Button) findViewById(R.id.btnSend);
//这对这个按钮做监听事件;发送信息,大喇叭...
btnSend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent=new Intent();
//设置intent的动作;后面字符串是自定义的
intent.setAction("android.intent.action.receiverdata");
intent.putExtra("msg","羊村各位村民开会了");
MainActivity.this.sendBroadcast(intent);
}
});
}
}
3.创建自己的广播 * 类
package com.aaa.btdemo02;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.text.TextUtils;
import android.util.Log;
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//接受广播
if(intent==null)return;
//intent:接受从主端传递过来的数据,action数据;
String action=intent.getAction();
//针对上述做判断;第一个判断是否为空也可以写成action.isEmpty
if(!TextUtils.isEmpty(action)&&"android.intent.action.receiverdata".equals(action)){
String msg=intent.getStringExtra("msg");//不习惯可以使用Bundle
Log.i("喜洋洋-->",msg);
}
}
}
4.注册广播
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.aaa.btdemo02">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.Btdemo02">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name=".MyReceiver"
android:exported="true">
<intent-filter>
<!-- 自定义的action名 -->
<action android:name="android.intent.action.receiverdata"/>
</intent-filter>
</receiver>
</application>
</manifest>
5.运行效果
在这里插入图片描述
来源:https://blog.csdn.net/zhangchen124/article/details/121105794


猜你喜欢
- 验证码逻辑以前在项目中也做过验证码,生成验证码的代码网上有很多,也有一些第三方的jar包也可以生成漂亮的验证码。验证码逻辑很简单,就是在登录
- bean.xml文件p标签使用报错The prefix "p" for attribute "p:某属性&qu
- 本文实例为大家分享了Android检测手机多点触摸点数的具体代码,供大家参考,具体内容如下多点触摸点数效果图Circle.javapacka
- 1、synchronized 方法与锁对象线程锁的是对象。1)A线程先持有 object 对象的 Lock 锁, B线程可以以异步的方式调用
- 百度一下搭建go-cqhttp,千篇一律都是采用python搭建的,Java搭建根本没有。导致自己在搭建的时候可折磨了,出现了许多的问题。唯
- C#客户端程序,生成后是一个exe,如果带有大量的dll,那么dll和exe会混乱在一起,看起来非常混乱,我们可以建立一个文件夹,把dll放
- 前言我们来分析一下堆内布局以及Java对象在内存中的布局吧。对象的指向先来看一段代码:package com.zwx.jvm;public
- Service的生命周期 (适用于2.1及以上)1. 被startService的无论是否有任何活动绑定到该Service,都在后台运行。o
- 所需引入Jar包:jms-1.1.jaractivemq-all-5.15.0.jar生产者package com.mousewheel.d
- 一、 HttpURLConnection以GET方式访问网络:HttpURLConnection connection = null;try
- JavaConfig,是在 Spring 3.0 开始从一个独立的项目并入到 Spring 中的。JavaConfig 可以看成一个用于完成
- 场景描述单例模式对于我们来说一点也不模式,是一个常见的名称,单例模式在程序中的实际效果就是:确保一个程序中只有一个实例,并提供一个全局访问点
- 一、ID生成策略1、使用@TableId注解@TableId注解:主键注解使用位置:实体类主键字段。@Data@ToString@Table
- 栈和队列的本质是相同的,都只能在线性表的一端进行插入和删除。因此,栈和队列可以相互转换。用栈实现队列—力扣232题题目要求:仅使用两个栈实现
- 简单几步,实现SpringMVC+servlet3.0文件上传功能:第一步:配置web.xml文件中的servlet,添加multipart
- 又遇到了回调函数,这次打算写下来分享一下。所谓回调函数,或者在面向对象语言里叫回调方法,简单点讲,就是回头在某个时间(事件发生)被调用的函数
- 现在的智能手机不敢说百分百的都是触摸屏,也应该是百分之九九以上为触摸屏了,触摸屏为我们操作无键盘、无鼠标的手机系统带来了很多的便利。当用户触
- 前言本文主要介绍的是关于C#中LINQ多条件JOIN时为什么可以使用匿名类的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细
- 最近项目中经常需要用到自定义控件,因此自定义属性也是经常要用到的,在此说明一下自定义属性的用法:自定义属性都存在于/value/attr.x
- 文件的读写是很多应用程序具有的功能,甚至某些应用程序就是围绕着某一种格式文件的处 理而开发的,所以文件读写是应用程序开发的一个基本功能。Qt