Broadcast 广播 的接收 和发送 -- Android(安卓)学习之路
sky-mxc 总结 转载注明:https://sky-mxc.github.io
Broadcast
在Android中 Broadcast是一种 广泛运用在引用程序之间传输信息的机制。
而BroadcastReceiver 是对发送出来的Broadcaset进行过滤接受并响应的一类组件。
如果不需发送广播到别的应用 使用 LocalBroadcastManger就可以了。
发送和接收流程
发送和接受的过程:
1. 发送 首先在需要发送信息的地方 ,把要发送的信息和用于过滤的信息(如action 和 category)封装进intent对象,然后调用 Context.sendBroadcast() 、sendOrderBroadcast()或sendStickBroadcast()方法,把intent对象以广播的形式发送出去2. 接收 当intent发送后,所有已经注册的BroadcastReceiver会检查注册时的IntentFilter是否与发送的intent匹配。若匹配就会调用BroadcastReceiver的onReceiver() 方法。所以 我们定义一个BroadcastReceiver的时候必须实现onReceiver()方法3. Note: 若在使用sendBroadcast()的方法时指定了接受权限,则只有在AndroidManifest.xml文件中声明了对应权限的BroadcastReceiver才能就收到; 同样的,如果在注册BroadcastReceiver时指定了可接受的Broadcast的权限,则只有在包的AndroidManifest.xml中用标签声明了。拥有此权限的Context对象所发送的Broadcast才能被这个BroadcastReceiver所接收。
*虽然 广播的发送和接受都是通过intent类,但是广播intent完全和 启动activity的intent不同。
BroadcastReceiver是无法看到启动activity的intent的。同样的,当你发送一个Broadcast Intent 是不会去发现或启动一个activity的。
两者是完全不同的。启动activity的intent是属于前台用户可以看到的操作,而 Broadcat Intent是后台操作 。通常用户是看不到 的。*
广播类型
两大类 广播类型 :
- 1. Normal broadcasts(普通广播) :使用 Context.sendBroadcast ;完全是异步操作,广播发出后广播的所有接受者通常都在同一时间运行并得到结果,但是顺序不固定。这样效率是很高的但是 接收器的结果并不能影响其他的接受者
- 2. Orderd broadcasts(有序广播) :同步操作一次发送到一个接受者 ,按照预先声明的顺序依次接受,(-1000~1000)优先级高的优先接受到广播,优先级高的可以更改广播或者完全终止这个广播(abortBroadcast()),那优先级低的接受者将不能接受到
接收广播
使用broadcastsReceiver 接受广播,定义自己的广播接收器 只需继承BroadcastsReceiver;
广播接收器创建完毕后需要注册才能接受到。注册分为两种 动态和静态;如果发送的广播附带有权限 ,那接受者必须有相应的权限才能接受到
- 在BroadcastReceiver中一般是用来启动 某个activity或者启动某个服务,不允许执行耗时操作,也不允许开线程,最好是操作不要超过10秒。*
定义 接收器 接收网络变化
继承
BroadcastReceiver
/** * Created by sky-mxc * 网络状态改变接收器 */public class NetworkReceiver extends BroadcastReceiver { private static final String TAG = "NetworkReceiver"; @Override public void onReceive(Context context, Intent intent) { Log.i(TAG,"=====网络状态改变了"); Toast.makeText(context,"网络状态改变了",Toast.LENGTH_LONG).show(); }}
静态注册
静态注册:在manifest文件 使用 标签注册 ,并在标签内设置过滤器(intentFilter) 什么时候都可以接受到广播,只要应用程序安装了 就是注册了,如果有广播就能接受 但是规定有部分广播 静态注册无法接受 例如屏幕的关闭和点亮广播。
<receiver android:name=".receiver.NetworkReceiver"> <intent-filter > <action android:name="android.net.conn.CONNECTIVITY_CHANGE">action> intent-filter>receiver>
动态注册
动态注册: 动态的在代码中定义。先定义设置好一个IntentFilter对象。然后在需要注册时调用Context.registerReceiver(),如果取消就调用Context.unregisterReceiver()方法。(动态注册的BroadcastReceiver在context被销毁后也会被干死)
使用
context.registerReceiver()
注册
receiver = new NetworkReceiver();IntentFilter intentFilter = new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE");intentFilter.setPriority(600);registerReceiver(receiver,intentFilter);
取消注册
context.unregisterReceiver();
@Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(receiver); }
发送广播
发送普通广播
使用方法
sendBroadcast()
发送广播。
//发送普通广播Intent intent = new Intent("com.mxc.example.broadcast.normal");intent.putExtra("type","normal");sendBroadcast(intent);
接收发送的广播
Manifest文件注册
<receiver android:name=".receiver.MyReceiver"> <intent-filter> <action android:name="com.mxc.example.broadcast.normal"/> intent-filter>receiver>
接收发送的数据
public class MyReceiver extends BroadcastReceiver { private static final String TAG = "MyReceiver"; @Override public void onReceive(Context context, Intent intent) { Log.i(TAG,"==action:"+intent.getAction()+"===time:"+ SystemClock.currentThreadTimeMillis()); Log.i(TAG,"==type:"+intent.getStringExtra("type")); }}
发送有序广播
使用 sendOrderedBroadcast()
如果接受者不需要权限 设置为null即可
Intent orderIntent = new Intent("com.mxc.example.broadcast.order");orderIntent.putExtra("type","order");//不添加权限sendOrderedBroadcast(orderIntent,null);
可以通过 priority
属性来设置接受者的优先级,优先级的接受者可以 终止广播的发送或者 添加额外的数据或者修改 发送的广播数据
终止 广播
if (intent.getAction().equals("com.mxc.example.broadcast.order")){ //终止广播 abortBroadcast(); }
添加或者修改数据
//增加额外的结果Bundle b = getResultExtras(true);//获取数据 如果没有就创建b.putString("result","MyReceiver");setResultExtras(b);
获取 额外的数据
Log.e(TAG,"==result:"+getResultExtras(true).getString("result"));
Log 信息
I/MyReceiver: ==action:com.mxc.example.broadcast.order===time:390 I/MyReceiver: ==type:order I/SecondReceiver: ==action:com.mxc.example.broadcast.order===time:391 I/SecondReceiver: ==type:order E/SecondReceiver: ==result:MyReceiver
本地广播
本地广播和广播的操作几乎是一致的不过是使用 LocalBroadcastManager 来管理的;发送的注册都是
LocalBroadcastManager
实例来管理本地广播和 广播一样 分为 异步广播和同步广播
发送本地广播
Intent localIntent = new Intent("com.example.broadcast.local.async");manager.sendBroadcast(localIntent);//发送 同步的(有序)的广播//manager.sendBroadcastSync(localIntent);
接收本地广播
manager = LocalBroadcastManager.getInstance(this);receiver = new LocalReceiver();IntentFilter filter = new IntentFilter("com.example.broadcast.local.async");manager.registerReceiver(receiver,filter);
各种广播
开机广播
接受的权限
android.intent.action.SCREEN_OFF
屏幕点亮 规定 只有动态注册才可以android.intent.action.SCREEN_ON
屏幕关闭 规定 只有动态注册才可以android.net.conn.CONNECTIVITY_CHANGE
网络状态改变
特别感谢: 本文中的图 都是从菜鸟扒的
更多相关文章
- Android权限操作之uses-permission详解
- android下的gdb调试
- android键盘输入读取
- Android(安卓)创建桌面快捷方式
- system 权限程序不能访问sd卡问题
- Android悬浮窗权限适配
- 【转】.Android-sharedUserId数据权限
- React Native在Android当中代码集成
- Android(安卓)使用Settings 数据库demo(源码)以及adb 读写settings