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

news2024/11/18 23:02:09

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("=======每次广播都会实例化一个新的广播组件进行操作======");
	}
	@Override
	public void onReceive(Context context, Intent intent) {
		Toast.makeText(context, "广播已经启动", Toast.LENGTH_SHORT).show();//显示信息
	}

}

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

<receiver
            android: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">
    <Button
        android: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;
	@Override
	protected 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() {
			@Override
			public void onClick(View v) {
				Intent it = new Intent("www.wanczy.com");//启动Action
				it.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 {
	@Override
	public IBinder onBind(Intent intent) {
		return null;
	}

	@Override
	public void onCreate() {
		System.out.println("=========onCreate=============");
		super.onCreate();
	}

	@Override
	public void onDestroy() {
		System.out.println("=========onDestroy=============");
		super.onDestroy();
	}

	@Override
	public 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("=======每次广播都会实例化一个新的广播组件进行操作======");
	}
	@Override
	public 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 {
	@Override
	protected 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() {
			
			@Override
			public 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 {
	@Override
	public 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"
	    />
    <TextView
        android:id="@+id/msg"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="当前没有设置闹钟" />
	<Button
        android:id="@+id/set"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="设置闹钟" />
	<Button
        android: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;// 保存分钟

	@Override
	protected 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 {
		@Override
		public 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);// 指定PendingIntent
			MyAlarmManagerActivity.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();
			}
		}
	}
}

  <receiver
            android: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.coloradmin.cn/o/1099448.html

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

相关文章

BAT026:删除当前目录指定文件夹以外的文件夹

引言&#xff1a;编写批处理程序&#xff0c;实现删除当前目录指定文件夹以外的文件夹。 一、新建Windows批处理文件 参考博客&#xff1a; CSDNhttps://mp.csdn.net/mp_blog/creation/editor/132137544 二、写入批处理代码 1.右键新建的批处理文件&#xff0c;点击【编辑】…

vueday01——使用属性绑定+ref属性定位获取id

1.属性绑定&#xff08;Attribute 绑定&#xff09; 第一种写法 <div v-bind:id"refValue"> content </div> 第二种写法&#xff08;省略掉v-bind&#xff09; <div :id"refValue"> content </div> 2.代码展示 <template…

【论文阅读】 Cola-Dif; An explainable task-specific synthesis network

文章目录 CoLa-Diff: Conditional Latent Diffusion Model for Multi-modal MRI SynthesisAn Explainable Deep Framework: Towards Task-Specific Fusion for Multi-to-One MRI Synthesis CoLa-Diff: Conditional Latent Diffusion Model for Multi-modal MRI Synthesis 论文…

谈谈 RDB

谈谈 RDB RDB&#xff1a;相当于对内存中的数据&#xff0c;拍一张数据快照。RDB文件存储的是二进制数据。 这里提一点&#xff0c;Redis 的快照是全量快照&#xff0c;也就是说每次执行快照&#xff0c;都是把内存中的「所有数据」都记录到磁盘中。 所以可以认为&#xff0c;执…

在 Windows Server RDS 服务器 上重置 120 天宽限期

如果您出于测试目的安装了 RDS Server 2016/2019/2022&#xff0c;并且 RDS 许可宽限期已过期&#xff0c;请继续阅读下面的内容以了解如何重置 120 天宽限期。您可能知道&#xff0c;在安装 RDS Server 2016 时&#xff0c;您有 120 天的时间来安装 RD 客户端访问许可证 &…

数据结构--堆

一. 堆 1. 堆的概念 堆&#xff08;heap&#xff09;&#xff1a;一种有特殊用途的数据结构——用来在一组变化频繁&#xff08;发生增删查改的频率较高&#xff09;的数据集中查找最值。 堆在物理层面上&#xff0c;表现为一组连续的数组区间&#xff1a;long[] array &…

【LeetCode】29. 两数相除

1 问题 给你两个整数&#xff0c;被除数 dividend 和除数 divisor。将两数相除&#xff0c;要求 不使用 乘法、除法和取余运算。 整数除法应该向零截断&#xff0c;也就是截去&#xff08;truncate&#xff09;其小数部分。例如&#xff0c;8.345 将被截断为 8 &#xff0c;-…

ubuntu 18.04 LTS交叉编译opencv 3.4.16并编译工程[全记录]

一、下载并解压opencv 3.4.16源码 https://opencv.org/releases/ 放到home路径下的Exe文件夹&#xff08;专门放用户安装的软件&#xff09;中&#xff0c;其中build是后期自建的 为了版本控制&#xff0c;保留了3.4.16&#xff0c;并增加了-gcc-arm 二、安装cmake和cmake-g…

nodejs基于vue网上考勤系统

本网上考勤系统是针对目前考勤的实际需求&#xff0c; 采用计算机系统来管理信息&#xff0c;取代人工管理模式&#xff0c;查询便利&#xff0c;信息准确率高&#xff0c;节省了开支&#xff0c;提高了工作的效率。 本网上考勤系统主要包括个人中心、员工请假管理、员工考勤管…

哈希表简介

基本介绍 思路分析 代码实现 # 哈希表 # 员工信息 class Emp:id: int 0name: str next Nonedef __init__(self, id, name):self.id idself.name namedef __str__(self):return f"id{self.id}, name{self.name}"class EmpLinkedList:# 头指针&#xff0c;指向第…

jenkins整合gerrit

背景 公司项目之前使用jenkins整合了gitlab&#xff0c;后面代码迁移到gerrit&#xff0c;所以需要修改jenkins配置。下面就简单的介绍一下jenkins如何整合gerrit。 环境 服务器&#xff1a;linux 环境&#xff1a;docker、jenkins 代码仓库&#xff1a;gerrit 前提 docke…

Flink的ResourceManager详解(一)

ResourceManager 总结 一、概述 1、ResourceManager 管理 Flink 集群中的计算资源&#xff0c;计算资源主要来自 TaskManager 组件。 2、如果集群采用 Native【本地模式】部署&#xff0c;则 ResourceManager 会动态地向集群资源管理器申请 Container 并启动TaskManager&…

depcheck检查项目依赖的安装情况-帮你解决各种项目运行灵异事件

depcheck检查项目缺失的依赖 depcheck介绍与安装介绍安装 depcheck使用基础使用注意 进阶使用 删除多余的依赖注意 depcheck介绍与安装 介绍 工作中&#xff0c;以下的场景恐怕大家都有经历过&#xff1a; 从代码仓库上面 clone 的项目&#xff0c;自己本地一运行就报错… 用…

Ruby和面向对象技术

Ruby和许多极为流行的编程语言都是面向对象的。多数的面向对象编程语言&#xff0c;每个对象都是一个样例或者既定类的实例以及独立对象的行为。 一、创建一个通用对象 创建一个通用对象 obj Object.new定义通用对象的行为 def obj.talk puts "I am an object"p…

MySQL远程连接

一、什么是mysq的远程连接? 1、本地连接 直接在本地使用mysqladmin命令登录 mysql -u root -p 解释如下: mysql:mysql 命令表示要启动 MySQL 客户端。-u root:-u 选项指定要使用的用户名。在这里,我们使用 root 用户名作为示例。-p:-p 选项需要用户输入密码。如果省…

Unexpected mutation of “dialogVisible“ prop.

问题记录&#xff1a; Vue2项目在封装element-ui的dialog组件时&#xff0c;eslint报错 Unexpected mutation of “dialogVisible” prop.eslintvue/no-mutating-props 大致意思是父组件传递过来的 dialogVisible 属性&#xff0c;不允许在子组件中修改父组件的值 解决方法&a…

qtabwidget 样式表

.QWidget{background-color: #ffffff; }/*设置TabWidget中QTabBar的样式*/ QTabWidget{background-color: #E6EBE8; } QTabBar::tab{background-color: #DEDEDE;font-family:Source Han Sans CN; /*设置tab中的文本的字体*/font-size:20pt;font-weight: normal;color:#3D3D3…

HCIP---BGP社团属性

文章目录 目录 文章目录 前言 一.BGP社团属性概述 公有社团属性 配置命令 前言 前文详细介绍了BGP的基础内容&#xff0c;本编将着重于BGP协议的另一个重点内容进行详解。 一.BGP社团属性概述 BGP社区属性是BGP路由协议中的一种特殊属性&#xff0c;可以用于指定一组AS号码&…

线程安全案例 --- 线程池

小王学习录 今日鸡汤什么是线程池为什么需要线程池1. 协程2. 线程池3. 什么是用户态和内核态使用线程池 --- java标准库1. 线程池的创建2. 工厂模式3. 线程池的使用ThreadPollExecutor类构造方法1. corePoolSize, maximumPoolSize 线程2. long keepAliveTime, TimeUnit unit 时…

paddlenlp:社交网络中多模态虚假媒体内容核查(特征篇)

初赛之特征构造 写在前面一、安装paddleOCR二、代码部分三、模型优缺点四、写在最后 写在前面 通过前面两篇文章的介绍&#xff0c;我们可以大致的知道模型用到的特征分为四块&#xff1a;qCap&#xff0c;qImg&#xff0c;captions&#xff0c;imgs。根据这些特征&#xff0c…