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

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

滚雪球学Java(87):Java事务处理:JDBC的ACID属性与实战技巧!真有两下子!

咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE啦,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~ 🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!! 环境说明:Windows 10

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

Android 10.0 mtk平板camera2横屏预览旋转90度横屏拍照图片旋转90度功能实现

1.前言 在10.0的系统rom定制化开发中,在进行一些平板等默认横屏的设备开发的过程中,需要在进入camera2的 时候,默认预览图像也是需要横屏显示的,在上一篇已经实现了横屏预览功能,然后发现横屏预览后,拍照保存的图片 依然是竖屏的,所以说同样需要将图片也保存为横屏图标了,所以就需要看下mtk的camera2的相关横屏保存图片功能, 如何实现实现横屏保存图片功能 如图所示: 2.mtk

android应用中res目录说明

Android应用的res目录是一个特殊的项目,该项目里存放了Android应用所用的全部资源,包括图片、字符串、颜色、尺寸、样式等,类似于web开发中的public目录,js、css、image、style。。。。 Android按照约定,将不同的资源放在不同的文件夹中,这样可以方便的让AAPT(即Android Asset Packaging Tool , 在SDK的build-tools目