Android组件之BroadCast简单实践

作为Android的四大组件之一,没有理由不介绍一下BroadCast,BroadCast中文简单翻译就是广播,前阵子浙江某大学的啦啦操,广场舞的大妈,其中大妈和学生从喇叭和音响上听到的声音就是事件源,接收者就是这些大妈和学生,程序源自实践,Android中BroadCast,有事件广播者也有事件接收者,Broadcast是一种广泛运用的在应用程序之间传输信息的机制,BroadcastReceiver是对发送出来的 Broadcast进行过滤接受并响应的一类组件,也就是接收者。讲完了基本的概念,可以开始基本的实践:

自定义广播的两种实现方式

两种实现方式,一种是静态,一种是动态,先看下静态的实现过程:

定义一个BookBroadCast接收者(有几个判断添加是系统广播需要的):

public class BookBroadCast extends BroadcastReceiver {

	private String tag = "BookBroadCast";

	@Override
	public void onReceive(Context context, Intent intent) {
		// TODO Auto-generated method stub
		String actionString = intent.getAction();
		String name = intent.getStringExtra("Name");
		if (actionString.equals(Intent.ACTION_TIME_CHANGED)) {
			Log.i(tag, "Name:" + name + "--Action:" + actionString
					+ "--哥们,时间改变了~");
		} else if (actionString.equals(Intent.ACTION_BATTERY_CHANGED)) {
			Log.i(tag, "Name:" + name + "--Action:" + actionString
					+ "--哥们,电量变了~");
		} else {
			Log.i(tag, "Name:" + name + "--Action:" + actionString);
		}
	}

}

  看下App页面:

静态广播对应第一个按钮,点击事件:

	Intent intent = new Intent("com.google.broadcast.BookBroadCast.static");
			intent.putExtra("Name", "静态广播");
			sendBroadcast(intent);

  静态广播需要在AndroidManifest.xml中注册一下:

   <receiver android:name="com.google.broadcast.BookBroadCast">
            <intent-filter >
                <action android:name="com.google.broadcast.BookBroadCast.static"/>
                   <action android:name="android.intent.action.TIME_SET"/>
            </intent-filter>
        </receiver>

  结果如下:

动态调用就是不需要在AndroidManifest.xml注册,在程序中动态生成filter设置action,在activity中的onStart注册,onStop终止:

	@Override
	protected void onStop() {
		// TODO Auto-generated method stub
		super.onStop();
		unregisterReceiver(bookReceiver);
	}

	@Override
	protected void onStart() {
		// TODO Auto-generated method stub
		super.onStart();
		IntentFilter intentFilter = new IntentFilter();
		intentFilter.addAction("com.google.broadcast.BookBroadCast.dymanic");
		bookReceiver = new BookBroadCast();
		registerReceiver(bookReceiver, intentFilter);

	}

  动态调用事件,对应第二个按钮:

	Intent dintent = new Intent("com.google.broadcast.BookBroadCast.dymanic");
			dintent.putExtra("Name", "动态广播");
			sendBroadcast(dintent);

  结果如下:

两种系统广播调用方式

关于系统广播的各种事件网上一找一堆,我就没必要贴在这里了,先来实现第三个和第四个按钮的事件,第三个是系统事件的改变,第四个是电池电量的改变:

第三个action的常量的和Intent枚举出来的名称有出入:

    <action android:name="android.intent.action.TIME_SET"/>

  调用的时候是这样的:

	Intent sintent = new Intent(Intent.ACTION_TIME_CHANGED);
			sintent.putExtra("Name", "不被保护系统广播");
			sendBroadcast(sintent);

  结果如下:

这个其实都没有什么大的问题,然后按照静态注册方式没法搞定第四个电池电量的问题,先来看第四个是如何实现的:

	IntentFilter systemintentFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
			systembookReceiver = new BookBroadCast();
			registerReceiver(systembookReceiver, systemintentFilter);

 首先可以看出不是静态注册的,需要动态注册,然后不需要调用sendBroadcast,结果如下:

这个问题解决都高了一个多小时,最终的Google的API找到对应的解释:

地址:http://developer.android.com/reference/android/content/Intent.html#ACTION_TIME_TICK

遇到问题发现Google才是最可靠的,也搜了不少中文文章,就不信没人遇到坑,哎,周六看博客的都是爱学习的孩子,周末愉快~

时间: 2024-10-03 14:38:41

Android组件之BroadCast简单实践的相关文章

Android组件化探索与实践

什么是组件化 不用去纠结组件和模块语义上的区别,如果模块间不存在强依赖且模块间可以任意组合,我们就说这些模块是组件化的. 组件化的好处 实现组件化本身就是一个解耦的过程,同时也在不断对你的项目代码进行提炼.对于已有的老项目,实现组件化刚开始是很难受的,但是一旦组件的框架初步完成,对于后期开发效率是会有很大提升的. 组件间间相互独立,可以减少团队间的沟通成本. 每一个组件的代码量不会特别巨大,团队的新人也能快速接手项目. 如何实现组件化 这是本文所主要讲述的内容,本篇文章同时适用于新老项目,文中会

Android 设计随便说说之简单实践(合理组合)

上一篇(Android 设计随便说说之简单实践(模块划分))例举了应用商店设计来说明怎么做模块划分.模块划分主要依赖于第一是业务需求,具体是怎么样的业务.应用商店则包括两个业务,就是向用户展示applist,和下载app.第二是运行环境,在Android平台,有androidsdk提供socket等API支持.因此将模块大体换发了5个模块.(当然了图片加载可以额外提出,用开源组件去做,但是这里为了说明如何设计,暂不提到.还有下载也可以利用开源组件)分别是如下: 模块1 UI模块,负责展示信息和用

【Android的从零单排开发日记】之入门篇(六)——Android四大组件之Broadcast Receiver

广播接受者是作为系统的监听者存在着的,它可以监听系统或系统中其他应用发生的事件来做出响应.如设备开机时,应用要检查数据的变化状况,此时就可以通过广播来把消息通知给用户.又如网络状态改变时,电量变化时都可以通过广播来通知用户.要做比喻的话,广播就像是我们的感官,能够有效且快速的从外界获取信息来反馈给自身. 一.广播的功能和特征 广播的生命周期很短,经过 调用对象—实现onReceive—结束 整个过程就结束了.从实现的复杂度和代码量来看,广播无疑是最迷你的Android 组件,实现往往只需几行代码

Android组件化框架设计与实践

在目前移动互联网时代,每个 APP 就是流量入口,与过去 PC Web 浏览器时代不同的是,APP 的体验与迭代速度影响着用户的粘性,这同时也对从事移动开发人员提出更高要求,进而移动端框架也层出不穷. 上图显示的是传统的服务端架构和客户端 App 架构对比.传统的服务端架构中最底下是一个 OS,一般是 Linux,最上面服务端的业务,而中间有非常多的层次可以在架构上,按照我们的意愿搭建中间的各个层次的衔接环节,使得架构具有足够的灵活性和扩展性.但是到了 App 就会面对一个完全不同的现状,App

使用Broadcast实现android组件之间的通信

android组件之间的通信有多种实现方式.Broadcast就是当中一种. 在activity和fragment之间的通信,broadcast用的很多其它本文以一个activity为例. 效果如图: 布局文件: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" andro

Android组件化最佳实践 ARetrofit原理

简介 ARetrofit是一款针对Android组件之间通信的框架,实现组件之间解耦的同时还可以通信. 源码链接:https://github.com/yifei8/ARetrofit欢迎star.issues.fork 组件化 Android组件化已经不是一个新鲜的概念了,出来了已经有很长一段时间了,大家可以自行Google,可以看到一堆相关的文章. 简单的来说,所谓的组件就是Android Studio中的Module,每一个Module都遵循高内聚的原则,通过ARetrofit来实现无耦合

Google Developing for Android 二 - Memory 最佳实践 // lightSky‘Blog

Google Developing for Android 二 - Memory 最佳实践 |   分类于 Android最佳实践 原文:Developing for Android, II The Rules: Memory 在决定应用的行为,是否有好的用户体验以及整体的设备体验来说,内存的使用可能是独立因素中最重要的.内存因素包括应用的内存占用,以及内存搅动(导致的垃圾回收会对运行期间的性能有影响). 避免在循环中分配内存 内存分配虽然不可避免,但是应尽可能的避免,特别是在平凡的调用的代码块

【Android开发精要笔记】Android组件模型解析

Android组件模型解析 Android中的Mashup 将应用切分成不同类别的组件,通过统一的定位模型和接口标准将他们整合在一起,来共同完成某项任务.在Android的Mashup模式下,每个组件的功能都可以被充分的复用.来自不同应用的组件可以有机地结合在一起,共同完成任务. 基于Mashup的Android应用模型 三个基本要素:组件.连接.配置 接口就是实现单元.从代码来看,组件就是派生自特定接口或基类的子类的实现,如界面组件Activity就是指派生自android.app.Activ

2015最流行的Android组件、工具、框架大全(转)

转自:2015最流行的Android组件.工具.框架大全 Android 是目前最流行的移动操作系统之一. 随着新版本的不断发布, Android的功能也日益强大, 涌现了很多流行的应用程序, 也催生了一大批的优秀的组件.本文试图将目前流行的组件收集起来以供参考, 如果你发现本文还没有列出的组件,欢迎在评论中贴出来,我会定期的更新本文. 部分图片需国内或许不能访问才能显示 很好的中文教程Google Android官方培训课程中文版 awesome-android, android列表. 另,g