android四大组件之BroadcastReceiver
今天回头看了自己之前学习的笔记,小结了一下BroadcastReceiver,供刚入门的朋友复习和参考。
BroadcastReceiver是android系统一个全局的监听器,可实现不同组件之间的通信。
创建自己的广播类
package com.example.yummyhttputil; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.IBinder; public class MyBoradcastReceiver extends BroadcastReceiver { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub } @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub } @Override public IBinder peekService(Context myContext, Intent service) { // TODO Auto-generated method stub return super.peekService(myContext, service); } }
注册广播
静态注册
<receiver android:name=".MyBoradcastReceiver "> <intent-filter> <action android:name="android.intent.action.MYBROADCAST_RECEIVER"/> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </receiver>配置了以上信息之后,只要是android.intent.action.MY_BROADCAST这个地址的广播,MyReceiver都能够接收的到。注意,这种方式的注册是常驻型的,也就是说当应用关闭后,如果有广播信息传来,MyReceiver也会被系统调用而自动运行。
动态注册
MyBoradcastReceiver receiver = new MyBoradcastReceiver (); IntentFilter filter = new IntentFilter(); filter.addAction("android.intent.action.MYBROADCAST_RECEIVER"); registerReceiver(receiver, filter);注意,registerReceiver是android.content.ContextWrapper类中的方法,Activity和Service都继承了ContextWrapper,所以可以直接调用。在实际应用中,我们在Activity或Service中注册了一个BroadcastReceiver,当这个Activity或Service被销毁时如果没有解除注册,系统会报一个异常,提示我们是否忘记解除注册了。所以,记得在特定的地方执行解除注册操作:
@Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(receiver); }
发送广播
public void send(View view) { Intent intent = new Intent("android.intent.action.MYBROADCAST_RECEIVER"); intent.putExtra("msg", "hello yummylau!"); sendBroadcast(intent); }
广播的种类
普通广播(Normal Broadcast)
普通广播对于多个接收者来说是完全异步的,通常每个接收者都无需等待即可以接收到广播,接收者相互之间不会有影响。对于这种广播,接收者无法终止广播,即无法阻止其他接收者的接收动作。有序广播(Ordered Broadcast)
有序广播比较特殊,它每次只发送到优先级较高的接收者那里,然后由优先级高的接受者再传播到优先级低的接收者那里,优先级高的接收者有能力终止这个广播。设置三个广播接受类,通过设置优先级来决定谁先消费该广播
<receiver android:name=".FirstReceiver"> <intent-filter android:priority="1000"> <action android:name="android.intent.action.MYBROADCAST_RECEIVER"/> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </receiver> <receiver android:name=".SecondReceiver"> <intent-filter android:priority="999"> <action android:name="android.intent.action.MYBROADCAST_RECEIVER"/> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </receiver> <receiver android:name=".ThirdReceiver"> <intent-filter android:priority="998"> <action android:name="android.intent.action.MYBROADCAST_RECEIVER"/> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </receiver>
三个接收者的<intent-filter>多了一个android:priority属性,并且依次减小。这个属性的范围在-1000到1000,数值越大,优先级越高。
发送有序广播
public void send(View view) { Intent intent = new Intent("android.intent.action.MYBROADCAST_RECEIVER"); intent.putExtra("msg", "hello yummylau!"); sendOrderedBroadcast(intent, "scott.permission.MY_BROADCAST_PERMISSION"); }
所以我们在AndroidMainfest.xml中定义一个权限:
<permission android:protectionLevel="normal" android:name="scott.permission.MYBROADCAST_RECEIVER_PERMISSION" />然后声明这个权限
<uses-permission android:name="scott.permission.MYBROADCAST_RECEIVER_PERMISSION" />如果第一个广播需要添加消息给第二个广播,可以在onReceive()中添加
Bundle bundle = new Bundle(); bundle.putString("addString","我是添加的消息"); setResultExtras(bundle);而第二个广播类中取出
Bundle bundle = getResultExtras(true); String add = bundle.getString("addString");取消继续传递广播
abortBroadcast();
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。