android 广播的使用
1.广播的简单介绍
1. android中的每个应用程序都可以对自己感兴趣的广播进行注册,这样该应用程序就只会接受自己所关心的广播内容,这些广播可能来自于系统的,也可能来自于其他应用程序的.而接收广播的方法则需要广播接收器(Broadcast Receiver).
2.接收系统广播
注册广播的方式有两种,一种是在代码中注册,另一种是在AndroidManifest,xml中注册.前者又称之为动态注册,后者又称之为静态注册.例如:
2.1 动态注册监听网络变化
新建一个类,让他继承自BroadcastReceiver,并重写父类中的onReceive()方法就可以了.这样当有广播的时候,onReceive()方法就会得到执行,具体的逻辑就可以在这里面去处理.
MainActivity中代码如下:
public class MainActivity extends Activity { private IntentFilter intentFilter; private NetWorkChangeReceiver netWorkChangeReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); intentFilter =new IntentFilter(); intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); netWorkChangeReceiver =new NetWorkChangeReceiver(); registerReceiver(netWorkChangeReceiver,intentFilter); } class NetWorkChangeReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { ConnectivityManager connectivityManager =(ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo =connectivityManager.getActiveNetworkInfo(); if(networkInfo !=null && networkInfo.isAvailable()){ Toast.makeText(context,"network is Available",Toast.LENGTH_SHORT).show(); }else { Toast.makeText(context,"network is unAvailable",Toast.LENGTH_SHORT).show(); } } } @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(netWorkChangeReceiver); }
}
intentfilter中添加的action是 android.net.conn.CONNECTIVITY_CHANGE, 因为当网络状态发生变化的时候,系统发出的刚好是值为 android.net.conn.CONNECTIVITY_CHANGE的广播。registerReceiver就是注册广播的方法.需要注意的是,动态注册的广播必须要取消注册才行,这里我们是在OnDestory方法中取消注册的。在onReceive()方法中的ConnectivityManager就是一个系统服务类,专门用于管理网络连接的,后面,如果有网络的话,就会弹出一个提示network is Available的提醒.对于监听网络状态,我们需要在Androidmanifest.xml文件中声明权限,
<uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
运行程序,效果如下.关闭手机wifi:
连接手机wifi:
2.2 静态注册实现开机启动
动态注册广播的缺点就是必须要在程序启动之后才能接收到广播,而静态注册的广播则可以在程序未启动的情况下就能接收到广播.
新建一个BootCompleteReceiver,继承自BroadcastReceiver,代码如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.administrator.broadcasttest">
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <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"></action> </intent-filter> </receiver> </application> </manifest>
在receiver中,name就是我们写的Java中的完整类名,action就是系统启动完成的广播.程序运行一下程序.博主是用手机实测的,华为荣耀7i,系统版本是6.0.程序安装完成后,在权限管理里面对应用所申请的权限允许,如下.
之后关机,再开机(这个图非常不好截,截了 6次 才截到,2333),如下:
需要注意的是,在广播接收器的onReceiver()方法中不能进行长期的耗时逻辑,否则会出现ANR.
3.发送自定义广播
广播主要分为两种类型,标准广播和有序广播.
3.1发送标准广播
新建一个MyBroadcastReceiver类继承自BroadcastReceiver,这个类就是用来接收广播的.代码如下:
public class MyBroadcastReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context,"receiver in MyBroadcastReceiver",Toast.LENGTH_SHORT).show(); }
}
代码很简单,就不说了,当 MyBroadcastReceiver接收到广播时候,就会弹出 receiver in MyBroadcastReceiver 的提示 . 我们在AndroidManifest.xml中注册,如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.administrator.broadcasttest">
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <receiver android:name=".MyBroadcastReceiver"> <intent-filter> <action android:name="com.dyk.broadcasttest.MyBroadcastReceiver"></action> </intent-filter> </receiver> </application> </manifest>
在activity_main.xml中代码添加一个按钮:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:id="@+id/button" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="发送广播"/>
</RelativeLayout>
,对按钮的时间处理:
public class MainActivity extends Activity {
... Button button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ... button =(Button)findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { sendBroadcast(new Intent("com.dyk.broadcasttest.MyBroadcastReceiver")); } }); }
}
重新运行程序,效果如下:
3.2发送有序广播.
我们新建另一个项目,BroadcastReceiver2,新建AnotherBroadcastReceiver,继承自BroadcastReceiver,代码如下:
public class AnotherBroadcastReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context,"receiver in AnotherBroadcastReceiver",Toast.LENGTH_SHORT).show(); }
}
然后在AndroidManifest.xml中对这个广播接收器进行注册:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.administrator.broadcastreceiver2"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> ... <receiver android:name=".AnotherBroadcastReceiver"> <intent-filter> <action android:name="com.dyk.broadcasttest.MyBroadcastReceiver"></action> </intent-filter> </receiver> </application> </manifest>
,可以看到AnotherBroadcastReceiver同样接收的是 com.dyk.broadcasttest.MyBroadcastReceiver,运行程序,然后回到上一节的Broadcast项目,点击发送按钮,会受到两条广播信息,
可以看出,广播是可以被其他应用程序所接收的。上面介绍的都是标准广播,下面我们来看一下有序广播,打开 Broadcast项目,修改MainActivity代码如下:
public class MainActivity extends Activity {
... Button button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); intentFilter =new IntentFilter(); intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); netWorkChangeReceiver =new NetWorkChangeReceiver(); registerReceiver(netWorkChangeReceiver,intentFilter); button =(Button)findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { sendOrderedBroadcast(new Intent("com.dyk.broadcasttest.MyBroadcastReceiver"),null); } }); }
sendOrderedBroadcast()方法中第二个参数是与权限有关的参数,我们传入null,现在重新运行下程序,没什么变化,但是现在的广播是有先后顺序的, 我们修改Broadcast中的AndroidManifest.xml文件,如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.administrator.broadcasttest">
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission><uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:supportsRtl="true"android:theme="@style/AppTheme"><activity android:name=".MainActivity"><receiver android:name=".MyBroadcastReceiver"><intent-filter android:priority="100"><action android:name="com.dyk.broadcasttest.MyBroadcastReceiver"></action></intent-filter></receiver></application></manifest>
将MyBroadcastReceiver的优先级设置了100,以保证它一定会在AnotherBroadcastReceiver之前收到广播.既然MyBroadcastReceiver以及获得了接收广播的优先权,那么MyBroadcastReceiver就可以选择是否允许广播继续传递了,修改MyBroadcastReceiver代码如下:
public class MyBroadcastReceiver extends BroadcastReceiver{@Overridepublic void onReceive(Context context, Intent intent) {Toast.makeText(context,"receiver in MyBroadcastReceiver",Toast.LENGTH_SHORT).show();abortBroadcast();}
}
abortBroadcast()方法表示将这条广播截断,后面的广播接收器就无法接收了.程序运行程序,会发现只有MyBroadcastReceiver中的Toast信息能够弹出,这说明这条广播经过MyBroadcastReceiver之后确实是终止传递了.
4.使用本地广播
前面我们接收和发送的广播全部都属于系统广播,既发送的广播能够被其他任何应用程序所接收到,这样就很容易引起安全问题,这时,就需要用到本地广播了,这个广播只能在我们应用程序内部传递,并且广播接收器只能接收来自于本应用的广播,需要注意的是,本地广播是不能通过静态注册方式来接收的.说了这么多,我们看个例子:
新建一个LocalBroadcastManager项目,MainActivity中代码如下:
public class MainActivity extends Activity {private IntentFilter intentFilter;private LocalReceiver localReceiver;private LocalBroadcastManager localBroadcastManager;private Button button;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);localBroadcastManager =LocalBroadcastManager.getInstance(this);button =(Button)findViewById(R.id.button);button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {localBroadcastManager.sendBroadcast(new Intent("com.dyk.broadcasttest.LOCAL_BROADCAST"));}});intentFilter =new IntentFilter();localReceiver =new LocalReceiver();intentFilter.addAction("com.dyk.broadcasttest.LOCAL_BROADCAST");localBroadcastManager.registerReceiver(localReceiver,intentFilter);//注册本地广播}@Overrideprotected void onDestroy() {super.onDestroy();localBroadcastManager.unregisterReceiver(localReceiver);}class LocalReceiver extends BroadcastReceiver{@Overridepublic void onReceive(Context context, Intent intent) {Toast.makeText(context,"received local broadcast",Toast.LENGTH_SHORT).show();}}
}
和动态注册很像,只不过注册和接收,取消注册要用到LocalBroadcastManager类,activity_main代码:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/activity_main"android:layout_width="match_parent"android:layout_height="match_parent"><Buttonandroid:id="@+id/button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="发送本地广播" />
</RelativeLayout>
,运行程序,
源码
android 广播的使用相关推荐
- Android 广播的生命周期
一:Android 广播的生命周期 一个广播接收者有一个回调方法:void onReceive(Context curContext, Intent broadcastMsg).当一 ...
- android广播接收器
Android程序创建广播接收器继承BroadcastReceiver Android广播接收器需要在AndroidManifest.xml文件中声明: <recevie android:nam ...
- Android广播机制:Broadcast
转载:Android总结篇系列:Android广播机制 1.Android广播机制概述 Android广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的就是广 ...
- Android广播接实现电话的监听(电话的状态,拦截)
Android广播接实现电话的监听 1:需要在AndroidManifest.xml清单中添加权限 <uses-permission android:name="android.per ...
- 图解 Android 广播机制
从现实生活中理解广播机制 一听到广播我们第一感觉就会联想到小时候村里面的广播,每逢村里有什么活动都是通过广播发送的.收听收音机也是一种广播,在收音机中有很多个广播电台,每个广播电台播放的内容都不相同. ...
- android 广播观察者,作业三——观察者模式在Android广播机制上的应用
观察者模式在Android广播机制上的应用 点击跳转项目git地址:https://github.com/Arfer-ustc/practice-Android.git 一.观察者模式在Android ...
- Android——广播
广播 广播(Broadcast)作为Android四大组件之一,重要性不言而喻. 什么是Android广播 系统运行时,会产生很多事件(比如:电量改变, 收发短信, 拨打电话, 屏幕解锁),那么某些事 ...
- Android 广播(Broadcast)
Android 广播Broadcast 1.小声嘀咕 2.广播机制简介 3.接收系统广播 3.1动态注册 3.2静态注册 4.发送自定义广播 4.1标准广播 4.2有序广播 5.使用本地广播 1.小声 ...
- Android——广播(BroadcastReceiver)
1. 简介 BroadcastReceiver (广播接收器),属于Android四大组件之一 Android 广播分为两个角色:广播发送者.广播接收者 用于监听 / 接收 应用发出的广播消息,并做出 ...
- Android广播(Broadcast)
Android广播(Broadcast) 一.Broadcast简介 Broadcast是android中的四大组件之一,是在组件之间传播数据(Intent)的一种机制.广播的发送者和接收者事先是不需 ...
最新文章
- #论文 《Wide Deep Learning for Recommender System》翻译
- 【笔记】c++中opencv的使用
- 这短短几行代码价值一万
- linux centos删除安装的包,CentOS yum认为已删除的软件包仍在安装中
- 【HDU5156】Harry and Christmas tree,两种离线的做法
- 运行linux中degui_Windows与Linux合二为一?终于能在windows上运行Linux了!
- 个人网页制作 大学生个人网页设计 个人网站模板 简单静态HTML个人网页作品 HTML+CSS+JavaScript
- 道格拉斯简化_简化组织变革:困惑的指南
- win7系统安装卡在启动服务器,安装win7卡在启动界面不动进不了BIOS的解决方法 - 系统家园...
- 微信公众平台开发(一) 申请微信公众账号
- selectpicker的使用方法
- 你的广告语,为什么用户记不住?
- rust 使用tokio的Notify 和timeout实现类似可超时条件变量的效果
- 目标导向的交互设计:About face 3 -- The essentials of interaction design 读书分享
- 腾讯社招iOS面试记录
- Spring MVC工作流程图
- 打开ppt时显示正在与服务器,1.在安装时显示无法连接到服务器或类似的网络出错信息.ppt...
- 杰里之ANC mic电路 【篇】
- spring context标签
- 京东软件测试岗:不忍直视的三面,幸好做足了准备,月薪18k,已拿offer
热门文章
- 剑侠世界2手游为什么不显示服务器,剑侠世界2手游属性系统详解
- OpenHarmony HDF 按键中断开发基于小熊派hm micro
- Springboot毕设项目社区生鲜商场系统rg450java+VUE+Mybatis+Maven+Mysql+sprnig)
- android连接usb后默认app,小米手机使用USB连接电脑后总是被自动安装应用软件怎么办...
- EndNote向别人同步并共享数据库
- 打开游戏出现对计算机更改,win10如何撤销“是否允许程序对计算机进行更改”提示 游戏设备问题解决分享!...
- 给出十六进制数转二进制数的汇编语言代码并画出流程图
- 【今日焦点】国行iPhone 6开启预订第一天,货源充足
- orcal SQL查询语句大全集锦
- AI面相解析系统配置详解