android 大喇叭,广播实战

2024-08-25 09:38
文章标签 实战 广播 android 喇叭

本文主要是介绍android 大喇叭,广播实战,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在学校里,通常每个教室都会有一个大喇叭,只要广播室有什么通知,全校师生都能听到,类似的工作原理在计算机领域也有很广泛的应用。

比如一个IP地址中最大的地址是被保留作为广播地址使用的。 一如:IP地址范围是192.1680.0.x,子网掩码为255.255.255.0的网络,广播地址地址就是192.168.0.255.同样android 中也提供了类似机制。

广播的分类:
1)标准广播,是一种异步执行的广播,一个广播发出后,所有的接受者几乎都会在同一时刻接受到广播消息。
2)有序广播,则是一种同步执行的广播,在广播发出后,同一时刻只会有一个接受者会收到消息,当其执行完
后,广播才能继续被传播,当然前面的接受者也可以截断广播,

例子:
1)动态注册监听网络变化

public class MainActivity extends Activity {////////////////////////////////////////////////////////////////////////////////////////////////private IntentFilter            m_intentFilter;private NetWorkChangeReceiver   m_receiver;////////////////////////////////////////////////////////////////////////////////////////////////@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);init();}private void init(){//新建一个广播的过滤器m_intentFilter = new IntentFilter();//当网络状态发生变化时 系统便会发送这个广播 因此这个过滤器就能捕捉到这个广播m_intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");//新建一个广播接受者m_receiver = new NetWorkChangeReceiver();//注册广播registerReceiver(m_receiver, m_intentFilter);}//当活动摧毁的时候 记得把广播取消注册@Overridepublic void onDestroy(){super.onDestroy();unregisterReceiver(m_receiver);}//重写广播接受者的方法class NetWorkChangeReceiver extends BroadcastReceiver{@Overridepublic void onReceive(Context context, Intent intent) {Toast.makeText(context,"网络状态发生变化",Toast.LENGTH_SHORT).show();}}
}

不过这里因为访问了网络状态,所以要在AndroidManifest.xml中加这样一行

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

2)静态注册实现开机自启动

新建一个Java类 继承自BroadcastReceiver

/*** Created by 李嘉诚 on 2015/5/25.* 最后修改时间: 2015/5/25*/
public class BootCompleteReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {Toast.makeText(context,"开机成功",Toast.LENGTH_LONG).show();}
}

由于接受系统广播,因此还需在AndroidManifest.xml中注册权限,除此之外还有广播接受者
AndroidManifest.xml文件如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.broadcast" ><application
        android:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" ><activity
            android:name=".MainActivity"android:label="@string/app_name" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><receiver android:name=".BootCompleteReceiver"><intent-filter><action android:name="android.intent.action.BOOT_COMPLETED"/></intent-filter></receiver></application><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission><uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission></manifest>

查看一下应用权限 就会发现有了开启自启动 同样你也可以重启一下机器 看有没有使用成功
这里写图片描述
3)自定义广播

新建一个广播接受者

package com.broadcast;import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;/*** Created by 李嘉诚 on 2015/5/25.* 最后修改时间: 2015/5/25*/
public class ChanBroadcastReceiver extends BroadcastReceiver {//当广播接受者收到广播时 便会调用这个方法@Overridepublic void onReceive(Context context, Intent intent) {Toast.makeText(context, "这是我自定义的广播", Toast.LENGTH_SHORT).show();}
}

在AndroidManifest.xml中注册一下广播

  <receiver android:name=".ChanBroadcastReceiver"><intent-filter><action android:name="com.theOldMen.CHAN_BROADCAST"></action></intent-filter></receiver>

使用的时候 直接发送广播就行了,action要和注册的时候一样

public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);init();}private void init(){findViewById(R.id.m_sendButton).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent x = new Intent("com.theOldMen.CHAN_BROADCAST");sendBroadcast(x);}});}
}

运行效果
这里写图片描述
4)发送有序广播
广播是一种跨进程的通信方式,读者可以自己写另外一个程序,接受同样的广播消息,你会发现当前应用发送的广播,其他注册过的程序都能接受到,这个问题我们会在下面进行讲解

我们现在需要准备的是:两个应用,这两个应用都接受同一个广播,到现在为止,我已经假设你已经完成了那必要的准备,我们开始讲解有序广播

发送有序广播非常简单,只需修改一行代码就行

       findViewById(R.id.m_sendButton).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent x = new Intent("com.theOldMen.CHAN_BROADCAST");sendOrderedBroadcast(x,null);}});

第二个参数可以不予理会,它是跟权限有关的

好像并没有什么特别,别急,有序广播是有优先级的,因而还需指定优先级

  <receiver android:name=".ChanBroadcastReceiver"><intent-filter android:priority="100"><action android:name="com.theOldMen.CHAN_BROADCAST"></action></intent-filter></receiver>

这里设置了优先级 为100

刚刚说到,其实当前的广播接受者是可以丢弃广播的
如下:

/*** Created by 李嘉诚 on 2015/5/25.* 最后修改时间: 2015/5/25*/
public class ChanBroadcastReceiver extends BroadcastReceiver {//当广播接受者收到广播时 便会调用这个方法@Overridepublic void onReceive(Context context, Intent intent) {Toast.makeText(context, "这是我自定义的广播", Toast.LENGTH_SHORT).show();//丢弃广播 后面的人无法收到消息abortBroadcast();}
}

5)使用本地广播

会看第四部分的内容,我们了解到,其实普通广播发送的时候,任何注册了接受者的应用都能够收到广播消息,那么这就必然带来安全问题,那么当我们要发送的数据带有一些敏感信息的时候呢,我们是不是应该换种方式。幸运的是android提供了一种机制,他也是一种广播,但只能让本应用的接受者能够收到消息。这就是本地广播。

本地广播的使用并不复杂,主要使用一个LocalBroadcastManager来对广播进行管理,并提供了发送广播和注册广播的方法,实例如下

public class MainActivity extends Activity {////////////////////////////////////////////////////////////////////////////////////////////////private static final String     s_action = "com.chan.LOCAL_BROADCAST";////////////////////////////////////////////////////////////////////////////////////////////////private LocalBroadcastManager   m_manager;private LocalReceiver           m_receiver;private IntentFilter            m_filter;////////////////////////////////////////////////////////////////////////////////////////////////@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);init();}private void init(){//获得本地广播管理器m_manager = LocalBroadcastManager.getInstance(this);//设置接受者m_receiver = new LocalReceiver();//获得过滤器m_filter = new IntentFilter();m_filter.addAction(s_action);//注册广播m_manager.registerReceiver(m_receiver,m_filter);findViewById(R.id.m_sendButton).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent x = new Intent(s_action);//发送广播m_manager.sendBroadcast(x);}});}@Overridepublic void onDestroy(){super.onDestroy();//取消注册m_manager.unregisterReceiver(m_receiver);}class LocalReceiver extends BroadcastReceiver{@Overridepublic void onReceive(Context context, Intent intent) {Toast.makeText(context,"本地广播",Toast.LENGTH_SHORT).show();}}
}

运行结果
这里写图片描述

这篇关于android 大喇叭,广播实战的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1105203

相关文章

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

Java MQTT实战应用

《JavaMQTT实战应用》本文详解MQTT协议,涵盖其发布/订阅机制、低功耗高效特性、三种服务质量等级(QoS0/1/2),以及客户端、代理、主题的核心概念,最后提供Linux部署教程、Sprin... 目录一、MQTT协议二、MQTT优点三、三种服务质量等级四、客户端、代理、主题1. 客户端(Clien

在Spring Boot中集成RabbitMQ的实战记录

《在SpringBoot中集成RabbitMQ的实战记录》本文介绍SpringBoot集成RabbitMQ的步骤,涵盖配置连接、消息发送与接收,并对比两种定义Exchange与队列的方式:手动声明(... 目录前言准备工作1. 安装 RabbitMQ2. 消息发送者(Producer)配置1. 创建 Spr

深度解析Spring Boot拦截器Interceptor与过滤器Filter的区别与实战指南

《深度解析SpringBoot拦截器Interceptor与过滤器Filter的区别与实战指南》本文深度解析SpringBoot中拦截器与过滤器的区别,涵盖执行顺序、依赖关系、异常处理等核心差异,并... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现

深度解析Spring AOP @Aspect 原理、实战与最佳实践教程

《深度解析SpringAOP@Aspect原理、实战与最佳实践教程》文章系统讲解了SpringAOP核心概念、实现方式及原理,涵盖横切关注点分离、代理机制(JDK/CGLIB)、切入点类型、性能... 目录1. @ASPect 核心概念1.1 AOP 编程范式1.2 @Aspect 关键特性2. 完整代码实

MySQL中的索引结构和分类实战案例详解

《MySQL中的索引结构和分类实战案例详解》本文详解MySQL索引结构与分类,涵盖B树、B+树、哈希及全文索引,分析其原理与优劣势,并结合实战案例探讨创建、管理及优化技巧,助力提升查询性能,感兴趣的朋... 目录一、索引概述1.1 索引的定义与作用1.2 索引的基本原理二、索引结构详解2.1 B树索引2.2

从入门到精通MySQL 数据库索引(实战案例)

《从入门到精通MySQL数据库索引(实战案例)》索引是数据库的目录,提升查询速度,主要类型包括BTree、Hash、全文、空间索引,需根据场景选择,建议用于高频查询、关联字段、排序等,避免重复率高或... 目录一、索引是什么?能干嘛?核心作用:二、索引的 4 种主要类型(附通俗例子)1. BTree 索引(

Java Web实现类似Excel表格锁定功能实战教程

《JavaWeb实现类似Excel表格锁定功能实战教程》本文将详细介绍通过创建特定div元素并利用CSS布局和JavaScript事件监听来实现类似Excel的锁定行和列效果的方法,感兴趣的朋友跟随... 目录1. 模拟Excel表格锁定功能2. 创建3个div元素实现表格锁定2.1 div元素布局设计2.

Redis 配置文件使用建议redis.conf 从入门到实战

《Redis配置文件使用建议redis.conf从入门到实战》Redis配置方式包括配置文件、命令行参数、运行时CONFIG命令,支持动态修改参数及持久化,常用项涉及端口、绑定、内存策略等,版本8... 目录一、Redis.conf 是什么?二、命令行方式传参(适用于测试)三、运行时动态修改配置(不重启服务

Android DataBinding 与 MVVM使用详解

《AndroidDataBinding与MVVM使用详解》本文介绍AndroidDataBinding库,其通过绑定UI组件与数据源实现自动更新,支持双向绑定和逻辑运算,减少模板代码,结合MV... 目录一、DataBinding 核心概念二、配置与基础使用1. 启用 DataBinding 2. 基础布局