Broadcastreceiver(广播接收器)
Broadcastreceiver(广播接收器)是用来接收Broadcast(广播)的一个组件。
广播可以由其他程序发出,当Broadcastreceiver接收到响应的Broadcast后会执行设定的功能。
例如系统开机的广播被App的广播接收器接收到后就执行在后台开启的功能。
(首先先声明,一般不建议用动态注册和异步广播(API23淘汰了))
一,首先四大组件都需要注册。
Broadcastreceiver有动态和静态两种注册方法:
1.静态注册,即在Androidmanifest.xml文件里面注册:
<receiver android:name="com.example.z_broadcastreceiver.MyBc1"> <intent-filter android:priority="100"> <action android:name="com.example.z_broadcastreceiver.MainActivity"/> </intent-filter> </receiver>
其中android:priority是优先级的设置,范围在-1000到1000之间,数字越大,接收到广播的优先级就越高。
<action></action>内的android:name是广播源的标签,通常广播源标签用包名.类名来做唯一的标识。
2.动态注册,在程序内用代码注册,在同一优先级下,动态注册比静态注册优先级要高。
不过动态注册有个缺点:就是动态注册只有在程序运行的时候才能接收到广播。
IntentFilter intentfilter = new IntentFilter("com.example.z_broadcastreceiver.MainActivity"); MyBc3 bc3 = new MyBc3(); registerReceiver(bc3, intentfilter);
其中MyBc3是一个自定义的广播接收者类。IntentFilter()内的是广播源标签。
注意!动态注册完后需要手动销毁广播。在重写Activity中的onDestry方法中销毁
@Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); unregisterReceiver(bc3); }
二,注册完广播接收器后,我们得接收广播
public class MyBc1 extends BroadcastReceiver{ @Override//一个处理接受到的广播的处理方法 public void onReceive(Context arg0, Intent intent) { /** * BroadcastReceiver的生命周期只有十秒左右 * 所有BroadcastReceiver不能进行一些比较耗时的操作 * 如果非要进行耗时的操作则应该通过Intent对象发送给Service来处理 * BroadcastReceiver不能使用子进程 */ String string = intent.getStringExtra("msg"); Log.i("tag", "第一个广播接收器:"+string); } }
public class MyBc2 extends BroadcastReceiver{ @Override//一个处理接受到的广播的处理方法 public void onReceive(Context arg0, Intent intent) { String string = intent.getStringExtra("msg"); Log.i("tag", "第二个广播接收器:"+string); } }
public class MyBc3 extends BroadcastReceiver{ @Override//一个处理接受到的广播的处理方法 public void onReceive(Context arg0, Intent intent) { String string = intent.getStringExtra("msg"); Log.i("tag", "第三个广播接收器:"+string); } }
为了验证优先级,我定义了三个广播接收器,注意三个都要注册。
三,发送广播。
在这个例子中我用了自定义程序发送的广播,没有用系统的广播,顺便学一些怎么样发送广播。
发送广播有三种类型(1)普通广播 Normal Broadcast 用sendBroadcast(Intent intent)方法发送广播.
(2)有序广播 Normal Broadcast 用sendOrderBroadcast(Intent intent)方法发送广播.
(3)异步广播 Normal Broadcast 用sendStickBroadcast(Intent intent)方法发送广播。
该方式的广播需要设置权限 <uses-permission android:name="android.permission.BROADCAST_STICKY"/>,很少用。
为了方便验证,测试程序定义了三个按钮分别代表三种发送方式:
我们的MyBc1和MyBc2用的是静态注册,MyBc3是动态注册:
public class MainActivity extends Activity { private MyBc3 bc3; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); /** * 动态组成广播 * 动态组成广播只能在程序运行时候才能接收得到 * 结束的时候需要销毁 */ IntentFilter intentfilter = new IntentFilter("com.example.z_broadcastreceiver.MainActivity"); bc3 = new MyBc3(); registerReceiver(bc3, intentfilter); } //广播需要用Intent对象传递信息 @SuppressWarnings("deprecation") public void Click(View view){ switch(view.getId()){ /** * 普通广播同级别收到广播的先后顺序是随机的
* 动态注册优先级高于静态注册。 * 同静态注册优先级高的先收到广播 * 接收器不能截断广播的继续传播也不能修改广播 * 普通广播是完全异步的,逻辑上可以在同一时刻被所有匹配的接受者接收到 * 消息传递效率高,缺点是接受者不能将处理结果传递给下一个接收者,也无法终止广播传播。 */ case R.id.button1: Intent intent = new Intent();//新建Intent对象 intent.putExtra("msg", "我是普通广播");//添加传递信息,“BC”是信息的标签 intent.setAction("com.example.z_broadcastreceiver.MainActivity");//广播的标签,只有标签为这个字符串的广播接收器才能接收到该广播。 sendBroadcast(intent);//发送普通广播 break; /** * 有序广播同级别收到广播的先后顺序是随机的 * 优先级高的先收到广播 * 能截断广播的继续传播,高级别的能截断低级别的,可以修改广播 * 同级别动态注册优先与静态注册接收广播 */ case R.id.button2: Intent intent2 = new Intent(); intent2.putExtra("msg", "我是有序广播"); intent2.setAction("com.example.z_broadcastreceiver.MainActivity"); sendOrderedBroadcast(intent2,null);//发送有序广播,后面是权限 break; //异步广播的生命周期长,可以先广播后注册,其他和普通广播差不多 case R.id.button3: Intent intent3 = new Intent(); intent3.putExtra("msg", "我是粘性广播"); intent3.setAction("com.example.z_broadcastreceiver.MainActivity"); sendStickyBroadcast(intent3);//发送异步广播 break; } } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); unregisterReceiver(bc3); } }
大家都没用设置优先级运行结果:
可以看出三种方法的动态注册的优先级都是高于静态注册的;
设置了优先级,MyBc2 = 200, MyBc1 =100, MyBc3 =50(动态注册需要intentfilter.setPriority()设置);
运行结果:
可以看出有序广播是按三个的优先级广播的,而另外两种都是动态优先,静态按优先级;
把MyBc3的动态注册放到异步广播发送之后:
可以看出异步广播可以在广播接注册前发送,其他两种需要在注册后才能发送。
在MyBc2中输出完后添加截断广播:abortBroadcast();
可以看出只有有序广播可以截断广播。
上面的例子中把动态注册放在了前面,运行的时候会一开始就调用了一次异步广播。
放在后面注册,即放在了异步广播之后注册,因为要在程序销毁时才能销毁,所以会不停的产生MyBc3接收器:
对动态注册和异步广播都不太熟悉。以后需要继续更新。(还有广播的修改,虽然感觉作用不大)
如果有什么错误,或者我理解错误或不当的,恳请大家纠正,谢谢!嘻嘻嘻~