Broadcast定义
android 广播的是Intent,广播接收者通过定义BroadcastReciever来定义接收(监听)感兴趣的内容,可以是系统的也可以是其他APP的。
Broadcast的功能
- 实现APP之间的通信
- 实现APP之间的逆向绑定,广播者无需在一开始就关心是谁需要监听他,实现灵活的注册
Broadcast的实现方式
广播接收者
- 实现广播接收器:继承BroadcastReciever,实现onReceive()方法
使用广播接收器,并注册相关广播的接收,有两种方式。
动态注册:在Activity中注册,使用方法registerReceiver(BroadcastReceiver,IntentFilter);该方法使用到广播接收器和Intent过滤器,过滤器注册需要监听的广播。代码如下
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); nbr= new NetBroadcastReceiver(); registerReceiver(nbr, intentFilter); } @Override protected void onDestroy() { super.onDestroy(); //动态注册一定要记得取消注册 unregisterReceiver(nbr); }
静态注册:在AndroidManifest.xml中通过 <receiver> 来注册。这种方式可以不用等到APP启动就可以接受广播消息。如下定义的广播接收器可以接收系统重启完成后的广播消息,并在onReceive方法中进行相关处理。以下配置自动监听系统启动广播,导致APP会在系统重启后自动启动。
<receiver android:name="com.example.broadcasttest.BootCompleteReceiver"> <intent-filter > <action android:name="android.intent.action.BOOT_COMPLETED"/> </intent-filter> </receiver>
注意: 因为广播接收者的调用是在主线程,所以广播接收器不能成立比较耗时的工作,否则可能会被强制中断而报错,也不能打开一个对话框等待业务输入。
自定义全局广播
发送标准广播:无序的
Activity中有sendBroadcast(Intent)的方法,可以生成全局广播,同时Intent可以携带数据。实例代码如下:
Button b = (Button)findViewById(R.id.sendBroadcast); b.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Intent in =new Intent("com.example.broadcast.MY_BROADCAST"); sendBroadcast(in);//发送全局广播 } });
发送有序广播
有序广播接收是按广播接收器配置的优先级的高低来先后接收消息的,高优先级的广播接收器,先接收,并可以终止广播的进一步传递给后续接收器。有序广播的触发很简单,调用Activity.sendOrderedBroadcast()方法。而广播接收器的优先级可以通过配置priority设置。
Button b = (Button)findViewById(R.id.sendBroadcast); b.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Intent in =new Intent("com.example.broadcast.MY_BROADCAST"); sendOrderedBroadcast(in,null);//发送全局有序广播 } });
配置AndroidMenifest.xml,在
intent-fitler
中增加Intent-priority
的属性<receiver android:name=".MyBroadcastReceiver"> <intent-filter android:priority="100"> <action android:name="com.example.broadcast.MY_BROADCAST"/> </intent-filter> </receiver>
本地广播
- 本地广播和全局广播的区别
- 本地广播只能是本APP的接收器接收,外部APP是无法接收的。相对比较安全。
- 全局广播是所有APP都可监听,如果使用不当会泄露信息。
- 本地广播处理效率比全局的高。
- 本地广播使用方式:
本地广播的触发方式简单,使用LocalBroadcastManager来广播,注册和取消注册。就是说,广播由LocalBroadcastManager来统一管理。
//首先通过工厂模式获取LocalBroadcastManager的实例
LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(this);
.....
//创建广播
Intent intent = new Intent("broadcastname");
lbm.sendBroadcast(intent);//发送本地广播
...
//设置广播接收器的过滤器(可以同时监听多个)
IntentFilter intentf = new IntentFilter();
intentf.addAction("broadcastname");
//别处定义好本地广播接收器的类,关键是实现方法类onRecieve()
LocalBroadcastReceiver lbr = new LocalBroadcastReceiver();
//设置监听
lbm.registerReceiver(lbr,intentf);
...
//注意在合适地方释放监听器,比如Activity.onDestroy()
lbm.unregisterReceiver(lbr);
- 3.