android 大喇叭,广播实战
来源:互联网 发布:证大财富淘宝贷怎么样 编辑:程序博客网 时间:2024/04/29 01:23
在学校里,通常每个教室都会有一个大喇叭,只要广播室有什么通知,全校师生都能听到,类似的工作原理在计算机领域也有很广泛的应用。
比如一个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; //////////////////////////////////////////////////////////////////////////////////////////////// @Override protected 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); } //当活动摧毁的时候 记得把广播取消注册 @Override public void onDestroy(){ super.onDestroy(); unregisterReceiver(m_receiver); } //重写广播接受者的方法 class NetWorkChangeReceiver extends BroadcastReceiver{ @Override public 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 { @Override public 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 { //当广播接受者收到广播时 便会调用这个方法 @Override public 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 { @Override protected 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() { @Override public void onClick(View v) { Intent x = new Intent("com.theOldMen.CHAN_BROADCAST"); sendBroadcast(x); } }); }}
运行效果
4)发送有序广播
广播是一种跨进程的通信方式,读者可以自己写另外一个程序,接受同样的广播消息,你会发现当前应用发送的广播,其他注册过的程序都能接受到,这个问题我们会在下面进行讲解
我们现在需要准备的是:两个应用,这两个应用都接受同一个广播,到现在为止,我已经假设你已经完成了那必要的准备,我们开始讲解有序广播
发送有序广播非常简单,只需修改一行代码就行
findViewById(R.id.m_sendButton).setOnClickListener(new View.OnClickListener() { @Override public 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 { //当广播接受者收到广播时 便会调用这个方法 @Override public 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; //////////////////////////////////////////////////////////////////////////////////////////////// @Override protected 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() { @Override public void onClick(View v) { Intent x = new Intent(s_action); //发送广播 m_manager.sendBroadcast(x); } }); } @Override public void onDestroy(){ super.onDestroy(); //取消注册 m_manager.unregisterReceiver(m_receiver); } class LocalReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context,"本地广播",Toast.LENGTH_SHORT).show(); } }}
运行结果
- android 大喇叭,广播实战
- 全局大喇叭 广播机制
- 全局大喇叭-广播机制
- 全局大喇叭 广播机制 Receiver
- 全局大喇叭,详解广播机制
- 全局大喇叭,广播机制初篇。
- 全局大喇叭,详解广播机制
- 全局大喇叭,详解广播机制
- 全局大喇叭,详解广播机制
- 复习android 的大喇叭~~~
- 【Android成长之路】全局大喇叭——广播机制的浅谈(发送自定义广播)
- 【Android成长之路】全局大喇叭——广播机制的浅谈(使用本地广播)
- 第5章 全局大喇叭,详解广播机制
- 第五章 全局大喇叭,详解广播机制
- 【Android成长之路】全局大喇叭——广播机制的浅谈(接收系统广播与动、静态注册接收器)
- 阅读郭林《第一行代码》的笔记——第5章 全局大喇叭,详解广播机制
- 第二行代码学习笔记——第五章:全局大喇叭——详解广播机制
- 2014-09-05 大喇叭
- 2.2.3 Partition List
- asm中如何删除其下的归档日志
- 函数混淆之Method Swizzling
- MFC 鼠标去留
- 利用Maven执行TestNG(( linux/windows)
- android 大喇叭,广播实战
- 应用窗口的创建过程
- 适配器模式
- 推荐一本不错的书《Sencha Ext JS 5 Bootcamp in a Book》
- mysql sql语句大全
- iOS开发截屏并保存图片到本地相册以及长按保存图片到本地
- Windows7下安装MongoDB
- android布局属性总结备用
- 多线程