Android组件通信——广播机制:BroadcastReceiver(二十九)

1. BroadcastReceiver

1.1 知识点

(1)掌握广播接收器的主要作用及基本实现;

(2)可以使用广播启动Service;

(3)理解闹钟服务的使用;

1.2 具体内容

广播这个名词大家并不陌生,就像电视信号一样,打开电视都可以接受到信号。广播是一种发出后不管的机制,不管接受者能否正常接受,广播发送者只管发送。在android中经常使用到广播机制,向各个应用程序发送消息。

通过这个图我们可以明白,广播机制里面还是需要使用Activity程序,如果说想要建立广播的话,还必须准备一个广播接收器。

package com.example.broadcast;import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;public class MyBroadcastReceiver extends BroadcastReceiver {public MyBroadcastReceiver(){System.out.println("=======每次广播都会实例化一个新的广播组件进行操作======");}@Overridepublic void onReceive(Context context, Intent intent) {Toast.makeText(context, "广播已经启动", Toast.LENGTH_SHORT).show();//显示信息}}

此时一个广播组件就定义好了,那么定义好了之后,我们需要在AndroidMainfest.xml进行注册。

<receiverandroid:name="com.example.broadcast.MyBroadcastReceiver"android:enabled="true" –启用广播><intent-filter>--匹配action操作是的广播<action android:name="android.intent.action.EDIT"/>                </intent-filter></receiver>

现在发现广播配置中需要配置一个<intent-filter>节点,表示此节点对一个指定的action操作的时候才会去启用广播。现在我们可以编写Activity程序进行广播的操作。现在通过按钮的事情启动广播。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><Buttonandroid:id="@+id/but"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="开始广播"/></LinearLayout>

现在的广播和服务一样,都需要通过Activity程序去启动,但是大家要记住一点,广播可以根据系统的状态进行启动。

对于广播的注册也可以由程序完成。

package com.example.broadcast;import android.app.Activity;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;public class BroadcastActivity extends Activity {private Button but = null;private MyBroadcastReceiver myBroadcastReceiver = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);super.setContentView(R.layout.activity_broadcast);this.but = (Button) super.findViewById(R.id.but);this.but.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Intent it = new Intent("www.wanczy.com");//启动Actionit.putExtra("msg", "jjm是万策的职工");//start 通过程序去注册广播BroadcastActivity.this.myBroadcastReceiver = new MyBroadcastReceiver();IntentFilter filter = new IntentFilter("www.wanczy.com");BroadcastActivity.this.registerReceiver(BroadcastActivity.this.myBroadcastReceiver, filter);//end 以上就是广播在程序进行注册BroadcastActivity.this.sendBroadcast(it);//进行广播}});}}

以上的广播就是手工在程序进行注册的。

现在我们也可以对程序进行稍稍的修改,因为现在不是针对所有的Action都进收听广播,必须针对过滤的Action进行。

建议大家以后在开发中使用配置文件的形式进行配置。

package com.example.broadcast;import android.app.Service;
import android.content.Intent;
import android.os.IBinder;public class MyService extends Service {@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic void onCreate() {System.out.println("=========onCreate=============");super.onCreate();}@Overridepublic void onDestroy() {System.out.println("=========onDestroy=============");super.onDestroy();}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {System.out.println("=========onStartCommand========="+intent);return Service.START_CONTINUATION_MASK;}}

定义Bordcast:

package com.example.broadcast;import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;public class MyBroadcastReceiver extends BroadcastReceiver {public MyBroadcastReceiver(){System.out.println("=======每次广播都会实例化一个新的广播组件进行操作======");}@Overridepublic void onReceive(Context context, Intent intent) {
//			Toast.makeText(context, "广播已经启动,"+intent.getStringExtra("msg") , Toast.LENGTH_SHORT).show();//显示信息context.startService(new Intent(context,MyService.class));//启动Service}}

对于广播来说,并没有太多复杂的操作,广播里面也可以不做任何的Action的过滤。我们现在对于服务来说,Activity可以启动,广播也可以启动,但是广播是可以在耨写特定的条件下启动服务的。例如手机开机的时候,或者一些特定的应用程序运行的时候才会去启动服务。

范例:设置闹钟

定义一个闹钟的提示类:

package com.example.alarmproject;import java.text.SimpleDateFormat;
import java.util.Date;import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;public class AlarmMessage extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);new AlertDialog.Builder(this).setIcon(R.drawable.logo).setTitle("闹钟时间已到").setMessage("闹钟响起,现在时间是:"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(System.currentTimeMillis()))).setPositiveButton("关闭", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {AlarmMessage.this.finish();}}).show();}
}
package com.example.alarmproject;import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;public class MyAlarmReceive extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {Intent it = new Intent(context,AlarmMessage.class);it.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//传递一个新的任务标记context.startActivity(it);//启动Intent}}

现在打开这个对话框的操作肯定是需要广播。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:gravity="center_horizontal"><TimePicker android:id="@+id/time"android:layout_width="match_parent"android:layout_height="wrap_content"/><TextViewandroid:id="@+id/msg"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="当前没有设置闹钟" /><Buttonandroid:id="@+id/set"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="设置闹钟" /><Buttonandroid:id="@+id/delete"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="删除闹钟" />
</LinearLayout>

通过定义的时间选择器,选择时间设置闹钟。

package com.example.alarmproject;import java.util.Calendar;import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.TimePicker;
import android.widget.TimePicker.OnTimeChangedListener;
import android.widget.Toast;public class MyAlarmManagerActivity extends Activity {private AlarmManager alarm = null;private Button set = null;private Button delete = null;private TextView msg = null;private TimePicker time = null;private Calendar calendar = Calendar.getInstance();// 取得日历操作类private int hourOfDay = 0;// 保存我们设置的小时数private int minute = 0;// 保存分钟@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);super.setContentView(R.layout.activity_my_alarm_manager);this.time = (TimePicker) super.findViewById(R.id.time);this.set = (Button) super.findViewById(R.id.set);this.delete = (Button) super.findViewById(R.id.delete);this.msg = (TextView) super.findViewById(R.id.msg);this.alarm = (AlarmManager) super.getSystemService(Context.ALARM_SERVICE);// 取得闹钟服务this.time.setOnTimeChangedListener(new OnTimeChangedListenerImpl());this.set.setOnClickListener(new SetOnClickListenerImpl());this.delete.setOnClickListener(new DeleteOnClickListenerImpl());this.time.setIs24HourView(true);// 设置24小时制}private class OnTimeChangedListenerImpl implements OnTimeChangedListener {@Overridepublic void onTimeChanged(TimePicker view, int hourOfDay, int minute) {MyAlarmManagerActivity.this.calendar.setTimeInMillis(System.currentTimeMillis());// 设置当前时间MyAlarmManagerActivity.this.calendar.set(Calendar.HOUR_OF_DAY,hourOfDay);MyAlarmManagerActivity.this.calendar.set(Calendar.MINUTE, minute);MyAlarmManagerActivity.this.calendar.set(Calendar.SECOND, 0);MyAlarmManagerActivity.this.calendar.set(Calendar.MILLISECOND, 0);MyAlarmManagerActivity.this.hourOfDay = hourOfDay;MyAlarmManagerActivity.this.minute = minute;}}private class SetOnClickListenerImpl implements OnClickListener {public void onClick(View v) {Intent intent = new Intent(MyAlarmManagerActivity.this,MyAlarmReceive.class);intent.setAction("www.wanczy.com");PendingIntent sender = PendingIntent.getBroadcast(MyAlarmManagerActivity.this, 0, intent,PendingIntent.FLAG_UPDATE_CURRENT);// 指定PendingIntentMyAlarmManagerActivity.this.alarm.set(AlarmManager.RTC_WAKEUP,MyAlarmManagerActivity.this.calendar.getTimeInMillis(),sender);MyAlarmManagerActivity.this.msg.setText("闹钟响起的时间是:"+ MyAlarmManagerActivity.this.hourOfDay + "时"+ MyAlarmManagerActivity.this.minute + "分");Toast.makeText(MyAlarmManagerActivity.this, "设置闹钟成功",Toast.LENGTH_SHORT).show();}}private class DeleteOnClickListenerImpl implements OnClickListener {public void onClick(View v) {if (null != MyAlarmManagerActivity.this.alarm) {// 只有闹钟设置之后才能取消设置Intent intent = new Intent(MyAlarmManagerActivity.this,MyAlarmReceive.class);PendingIntent sender = PendingIntent.getBroadcast(MyAlarmManagerActivity.this, 0, intent,PendingIntent.FLAG_UPDATE_CURRENT);MyAlarmManagerActivity.this.alarm.cancel(sender);//取消闹钟MyAlarmManagerActivity.this.msg.setText("当前没有设置闹钟");Toast.makeText(MyAlarmManagerActivity.this, "闹钟删除成功",Toast.LENGTH_SHORT).show();}}}
}
  <receiverandroid:name="com.example.alarmproject.MyAlarmReceive"android:enabled="true"android:process=":remote"—开辟一个新的进程><intent-filter><action android:name="www.wanczy.com"/></intent-filter>            </receiver>

1.3 小结

(1)广播属于触发式操作,当有了指定操作之后会自动启动广播;

(2)通过广播可以实现Service程序的启动;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/109326.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

信创办公–基于WPS的Word最佳实践系列 (图文环绕方式)

信创办公–基于WPS的Word最佳实践系列 &#xff08;图文环绕方式&#xff09; 目录 应用背景操作步骤1、 打开布局选项中图文环绕方式的方法2、 图文环绕三大类型 应用背景 在Word中&#xff0c;对文字和图片进行排版时&#xff0c;采用各种不同的图片与文字组合效果能够使页面…

Android 自定义view 圆形进度条

Android 自定义view 圆形进度条 前言一、码前分析二、开码1.画笔2.弧度3.圆弧的位置4.暴露给外部设置进度条的方法三、使用四、完整代码 总结 前言 先来看看效果&#xff0c;大概要实现这么一个圆形的进度条 一、码前分析 要实现这么一个进度条的效果&#xff0c;实际上是要画…

cbu和无cc的shiro反序列化

前置知识 学习CommonsBeanutils之前应该知道 javaBean&#xff0c;可以看《Java简单特性》也可以看这里有关BeanComparator的介绍TemplatesImpl gadget&#xff0c;前两个方法是public TemplatesImpl#getOutputProperties() -> TemplatesImpl#newTransformer() -> Tem…

【前端学习】—ES6新增的方法有哪些(十五)

【前端学习】—ES6新增的方法有哪些&#xff08;十五&#xff09; 一 、ES6中新增的方法 &#xff08;一&#xff09;、Object.is() //用于判断两个值/数据类型是否相等/* 特点&#xff1a;不仅可以对值类型进行正常处理&#xff0c;对象类型的值也可以处理对于特殊的值NaN 也…

第七版教材下的PMP考试有多难?

考过了几次就没多难了&#xff0c;主要是看考纲&#xff0c;其中的难点就是敏捷的内容多了不少&#xff0c;包含在考纲的三大模块中&#xff0c;pmp考试没有专门的敏捷教材&#xff0c;需要自己去找资料备考。 第七版教材主要内容&#xff1a; 考纲三大模块分析&#xff1a; …

10-k8s-身份认证与鉴权

文章目录 一、ServiceAccount介绍二、ServiceAccount相关的资源对象三、dashboard空间示例 一、ServiceAccount介绍 ServiceAccount&#xff08;服务账户&#xff09;概念介绍 1&#xff09;ServiceAccount是Kubernetes集群中的一种资源对象&#xff0c;用于为Pod或其他资源提供…

【C++】多态 -- 详解

⚪前言 声明一下&#xff0c;下面的代码和解释都是在 VS2019 下的 X86 程序中进行的&#xff0c;涉及的指针都是 4 bytes。如果要其他平台下&#xff0c;部分代码需要改动。比如&#xff1a;如果是 X64 程序&#xff0c;则需要考虑指针是 8 bytes 问题等等。其它编译环境下&…

2023年中国有创呼吸机产量、需求量及行业市场规模分析[图]

有创呼吸机主要是通过气管插管或者气管切开&#xff0c;然后通过管道连接在呼吸机上&#xff0c;为患者提供呼吸支持&#xff0c;主要针对的患者是昏迷的&#xff0c;无自主呼吸或不能耐受无创呼吸机的患者。 有创呼吸机是高端医疗装备&#xff0c;设计、生产和临床验证都必须经…

机器学习笔记 - 3D 对象跟踪极简概述

一、简述 大多数对象跟踪应用程序都是 2D 的。但现实世界是 3D 的,无论您是跟踪汽车、人、直升机、导弹,还是进行增强现实,您都需要使用 3D。在 CVPR 2022(计算机视觉和模式识别)会议上,已经出现了大量3D目标检测论文。 二、什么是 3D 对象跟踪? 对象跟踪是指随着时间的…

【JVM面试】从JDK7 到 JDK8, JVM为啥用元空间替换永久代?

系列文章目录 【JVM系列】第一章 运行时数据区 【面试】第二章 从JDK7 到 JDK8, JVM为啥用元空间替换永久代&#xff1f; 大家好&#xff0c;我是青花。拥有多项发明专利&#xff08;都是关于商品、广告等推荐产品&#xff09;。对广告、Web全栈以及Java生态微服务拥有自己独到…

MySQL [基础] 学习笔记

MySQL 学习 文章目录 MySQL 学习1. 数据库三层结构2. 数据在数据库中的存储方式3. SQL 语句分类3.1 备份恢复数据库的表 4. Mysql 常用数据类型(列类型)4.1 数值型(整数)的基本使用4.2 数值型(bit)的使用4.3 数值型(小数)的基本使用4.4 字符串的基本使用(面试题)4.5 字符串使用…

2020年下半年~2022下半年下午题易错总结

2020年下半年 试题一&#xff1a; 1.组播报文对无线网络空口的影响主要有(14) &#xff0c;随着业务数据转发的方式不同, 组播报文的抑制分别在 (15)、(16) 配置。 答案&#xff1a; &#xff08;14&#xff09;无线空口拥塞 &#xff08;15&#xff09;直连AP的交换…

软件测试需要学习什么?好学吗?需要学多久?到底是报班好还是自学好?

前言&#xff1a; 上篇文章看到很多小伙伴在讨论做测试到底怎么样&#xff0c; 其中很有很多的小伙伴还踩不少的坑&#xff0c;花费了大量的精力和时间去探索&#xff0c;结果还是一无所获。这里给大家出一期关于软件测试萌新的疑惑&#xff0c;看完这篇文章你就知道软件测试…

AR智能眼镜主板设计方案_AR眼镜PCB板设计

AR智能眼镜是一种采用先进技术的创新产品&#xff0c;具备强大的功能和性能。它采用了MTK8788八核 12nm低功耗硬件平台&#xff0c;搭载IMG GE830063OMhz或以上的GPU&#xff0c;并运行Android 11.0或以上的操作系统。该眼镜支持光波导1080P显示和LVDS接口自由曲面显示&#xf…

信钰证券:新增融券交易明显降温 业内称新规将平衡多类型投资者利益

10月14日&#xff0c;中国证监会发布调整优化融券相关准则的通知&#xff0c;沪深北买卖所齐发具体安排&#xff0c;阶段性收紧融券和战略出资者配售股份出借。其间&#xff0c;融券保证金比例进步自10月30日起实施&#xff0c;战略出资者配售股份出借收紧等其他条款自10月16日…

爆肝整理,性能测试-非GUI模式执行Jemter压测,看这篇就够了...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、上传脚本 把在…

智慧公厕:探索未来城市环境卫生设施建设新标杆

智慧公厕是当代城市建设的一项重要举措&#xff0c;它集先进技术、人性化设计和智能管理于一体&#xff0c;为人们提供更为舒适、便捷和卫生的厕所环境。现代智慧公厕的功能异常丰富&#xff0c;从厕位监测到多媒体信息交互&#xff0c;从自动化清洁到环境调控&#xff0c;每一…

chatgpt图片识别、生成图片、语音对话多模态深度试玩

大模型替代人的工作的能力&#xff0c;越来越明显了。最近chatgpt支持多模态了&#xff0c;看这大佬们玩的不易乐乎&#xff0c;手痒也想试一试&#xff0c;因此有给openai上供了20刀。 另外我是gpt的拥护者&#xff0c;但是周围的同事有对此担忧&#xff0c;因为他们长期积累的…

Tengine 边缘AI计算框架移植RV1126(包括opencv的交叉编译)

目录 1.编译opencv 2.拷贝SDK源码到虚拟机 3. 拉取TIM-VX代码 4.拉取Tengine源码并配置 1.编译opencv 编译opencv是为了&#xff0c;在编译Tengine时指定OpenCVConfig.cmake,以便寻找特定的opencv动态库 01.从github拉取opencv源代码 git clone -b 4.5.5 https://github.co…

【AIFEM案例操作】水轮机转轮强度和模态分析

AIFEM是由天洑自主研发的一款通用的智能结构仿真软件&#xff0c;助力用户解决固体结构相关的静力学、动力学、振动、热力学等实际工程问题&#xff0c;软件提供高效的前后处理工具和高精度的有限元求解器&#xff0c;帮助用户快速、深入地评估结构的力学性能&#xff0c;加速产…