Android中Broadcast简介与使用
Android中Broadcast简介与使用
- Broadcast与Broadcast Receiver的分类
-
- Broadcast分类
- Broadcast Receiver的分类
- 动态与静态广播接收器注册
-
- 两者的区别
- 动态广播接收器的注册
- 静态广播接收器的注册
- 标准广播和有序广播
-
- 标准广播
- 有序广播
- 本地广播的实现
Broadcast与Broadcast Receiver的分类
Broadcast分类
广播按照传播方式分为两类,不解释,先上图
Broadcast Receiver的分类
广播虽然传播了出来,但是没有相应的接收器,发了也是白发,而接收器也是分类的,按照注册方式分类,继续上图
动态与静态广播接收器注册
两者的区别
1.动态注册的广播 永远要快于 静态注册的广播,不管静态注册的优先级设置的多高,不管动态注册的优先级有多低>
2.动态注册广播不是 常驻型广播 ,也就是说广播跟随activity的生命周期。注意: 在activity结束前,移除广播接收器。静态注册是常驻型 ,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。
3.在同一个优先级下,谁先启动的快,谁将先接收到广播.
动态广播接收器的注册
安卓在执行一些操作,比如开机,关机,或者连接网络,断开网络时,会发送一些系统广播,这些广播是可以被接收到的。
我们以接受网络变化的广播为例,网络如果连接,则发出一条Toast。已知信息:在网络连接发生变化时,安卓系统会发出一条“android.net.conn.CONNECTIVITY_CHANGE”的广播
1:在xml里添加权限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
2:写一个网络监听接收器类,继承自原有的广播接收器,并重写onReceive方法,因为当接收到广播时,这个方法就会被调用,用于告知我们网络是否发生变化,
class NetworkChangeReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context,"network change",Toast.LENGTH_SHORT).show(); } }
3:在onCreate()中创建一个IntentFilter实例,并添加广播信息,添加这个信息目的是为了第三步注册广播。
intentFilter = new IntentFilter();intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
4,声明一个实例,注册 广播接收器,并取消注册 广播接收器
private NetworkChangeReceiver networkChangeReceiver;//声明
networkChangeReceiver = new NetworkChangeReceiver();registerReceiver(networkChangeReceiver, intentFilter);//注册广播接收器,这两行代码在第二步后面
@Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(networkChangeReceiver); }
注意:这里的取消注册 广播接收器 是写在onDestroy()内的,原因是,这是动态注册,只有在程序开启时才能使用,但我们的目的是为了检测网络的变化,需要切换程序,因此写在onDestroy()内,onDestroy()只有按下back键才会调用,因此我们直接按下home键,进入setting -> Data usage->关闭Cellular或者打开Cellular会出现Toast提醒。
静态广播接收器的注册
静态广播接收器的注册相对来说更为简单,我们还是以监听网络变化广播为例
1:在xml里添加权限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
2:New-other-Broadcast Receiver 如下图(全部勾选)
3:在xml内注册添加相应的action
<receiver android:name=".NetworkchangeReceiver" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> </intent-filter> </receiver>
4:在NetworkchangeReceiver中修改
public class NetworkchangeReceiver extends BroadcastReceiver { @Overridepublic void onReceive(Context context, Intent intent) { Toast.makeText(context,"network change now",Toast.LENGTH_LONG).show(); }}
好的,理论上来说上面的代码虽然简单,但是你应该了解了静态注册的基本过程。然后我要说的是,这个例子是无法达到效果的,你是无法接收到Toast消息的,为什么呢,因为我后来发现在Android7.0 上为了优化后台省电相关的东西,已经将静态注册这个广播方式取消了,7.0 版本上静态注册此广播的,已经无法收到这个广播了,Android 7.0 为了后台优化,推荐使JobScheduler 代替 BroadcastReceiver 来监听,具体的我就不详解了,跑题了。你可以参考Android 7.0 网络变化监听
标准广播和有序广播
标准广播
标准广播一般通过Intent来实现,代码极其简单,当然前提你需要写一个广播接收器,不然发出了广播也没用。如下图所示,我们就发送了一条"com.example.broadcasttest.LOCAL_BROADCAST"的广播
Intent intent = new Intent("com.example.broadcasttest.LOCAL_BROADCAST"); sendBroadcast(intent);//标准广播
有序广播
有序广播与标准广播类似
ntent intent = new Intent("com.example.broadcasttest.LOCAL_BROADCAST"); sendOrderedBroadcast(intent, null);//发送有序广播,第二个参数一般为null
不过既然是有序广播,那接受这条广播的顺序,就有讲究了,我们可以通过android:priority来设置谁先接收这条广播,例如下列静态注册的 intent filter 内添加了这个优先级,优先级越高,接收有序广播的顺序越前。
<intent-filter android:priority="100">//设置优先级 <action android:name="com.example.broadcasttest.MY_BROADCAST" /> </intent-filter>
截断广播,有序广播的另一个优点就是能被截断,可以在当前接收这条广播的接收器onReceive()内完成这项操作。
abortBroadcast();//截断
本地广播的实现
本地广播的意思就是说在应用内发起广播,且不会传到其他应用,自产自销。它的优势十分明显,高效,安全,而且实现起来简单。
1:写一个本地广播接收器,并注册,这里使用动态注册(因为之前讲过,就不加以详解),没有必要静态注册,因为这是应用内部的广播,启动后接收就可以。
class LocalReceiver extends BroadcastReceiver { //本地广播接收器 @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "received local broadcast", Toast.LENGTH_SHORT).show(); } }
private LocalReceiver localReceiver;
intentFilter = new IntentFilter(); 、intentFilter.addAction("com.example.broadcasttest.LOCAL_BROADCAST");
localReceiver = new LocalReceiver(); localBroadcastManager.registerReceiver(localReceiver, intentFilter);
记得取消注册,如下
@Override protected void onDestroy() { super.onDestroy(); localBroadcastManager.unregisterReceiver(localReceiver); }
2:利用LocalBroadcastManager对广播进行管理
private LocalBroadcastManager localBroadcastManager;
localBroadcastManager = LocalBroadcastManager.getInstance(this);//获取实例
3:发送广播
Intent intent = new Intent("com.example.broadcasttest.LOCAL_BROADCAST"); sendBroadcast(intent);//自定义广播 localBroadcastManager.sendBroadcast(intent);//发送本地广播
总结:所谓本地广播,无论是发送还是接收,其实都是通过LocalBroadcastManager来管理的
写代码时的智障操作:在xml中加入中文注释不曾想导致mainifests文件丢失。
更多相关文章
- Android(安卓)应用程序开发基础
- Android——Tomcat+MySQL+Servlet,实现将Client传入的数据写入MyS
- Android(安卓)基础总结:(七)BroadcastReceiver详解(上)
- [原]Android应用程序注册广播接收器(registerReceiver)的过程分析
- 通过广播Intent控制Android系统自带的音乐播放器
- android:注册时的协议---》方法一:弹出框
- android 禁用解锁
- [Android] Android(安卓)监听WIFI
- Android实现开机自启动Service