1.广播的分类
1.普通广播:普通广播相互都是异步的,相互之间没有任何干扰。每个接受者不需要等待就可以收到广播,并且它们之间没有办法终止广播,即,无法终止其他接受者的接受动作。
定义3个广播:
public class FirstRecevier extends BroadcastReceiver{ private static final String Tag = "MyInfo"; @Override public void onReceive(Context context, Intent intent) { String msg = intent.getStringExtra("msg"); Log.i(Tag,"FirstReceiver: "+msg); //普通广播不能终止广播 //abortBroadcast(); } }
public class SecendRecevier extends BroadcastReceiver{ private static final String Tag = "MyInfo"; @Override public void onReceive(Context context, Intent intent) { String msg = intent.getStringExtra("msg"); Log.i(Tag, "SecendRecevier: " + msg); } }
public class ThreeRecevier extends BroadcastReceiver{ private static final String Tag = "MyInfo"; @Override public void onReceive(Context context, Intent intent) { String msg = intent.getStringExtra("msg"); Log.i(Tag, "ThreeRecevier: " + msg); } }
以上3个广播皆可以收到消息;如果在第一个广播的onReceive()方法中加入abortBroadCast()终止广播方法。
测试之后发现其他2个广播任然可以进行接收动作。所以得出结论,普通广播,无法终止广播。
2.有序广播:有序广播的传递机制,优先级最高的广播首先得到消息,然后经由这个广播,将消息传递到下一个优先级的广播中。优先级最高的广播有能力终止广播。
优先级为1000的广播:
public class FirstRecevier extends BroadcastReceiver{ private static final String Tag = "MyInfo"; @Override public void onReceive(Context context, Intent intent) { String msg = intent.getStringExtra("msg"); Log.i(Tag,"FirstReceiver: "+msg); //普通广播不能终止广播 //abortBroadcast(); //有序广播实验 Bundle bundle = new Bundle(); bundle.putString("msg", msg + "@FirstRecevier"); setResultExtras(bundle); } }
它对应的静态注册:
<receiver android:name=".FirstRecevier"> <intent-filter android:priority="1000"> <action android:name="android.intent.action.MY_BROADCAST"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </receiver>
优先级为999的广播:
public class SecendRecevier extends BroadcastReceiver { private static final String Tag = "MyInfo"; @Override public void onReceive(Context context, Intent intent) { String msg = getResultExtras(true).getString("msg"); Log.i(Tag, "SecendRecevier: " + msg); Bundle bundle = new Bundle(); bundle.putString("msg",msg + "@SecendReceiver"); setResultExtras(bundle); } }
它对应的静态注册:
<receiver android:name=".SecendRecevier"> <intent-filter android:priority="999"> <action android:name="android.intent.action.MY_BROADCAST"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </receiver>
优先级最低的广播:
public class ThreeRecevier extends BroadcastReceiver{ private static final String Tag = "MyInfo"; @Override public void onReceive(Context context, Intent intent) { String msg = getResultExtras(true).getString("msg"); Log.i(Tag, "ThreeRecevier: " + msg); } }
它对应的静态注册:
<receiver android:name=".ThreeRecevier"> <intent-filter android:priority="998"> <action android:name="android.intent.action.MY_BROADCAST"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </receiver>
其中:setResultExtras()为,将它的结果封装为一个结果集,并传递打下一个优先级的广播中。所以,在下一个广播中我们需要使用:getResultExtras(true).get()来获取消息。
使用有序广播:
Intent intent = new Intent("android.intent.action.MY_BROADCAST"); intent.putExtra("msg","my world"); sendOrderedBroadcast(intent,"wangpei.permission.MY_BROADCAST_PERMISSION");
其中的
wangpei.permission.MY_BROADCAST_PERMISSION
为自定义的权限,即:
<permission android:protectionLevel="normal" android:name="wangpei.permission.MY_BROADCAST_PERMISSION"/>
使用该权限:
<uses-permission android:name="wangpei.permission.MY_BROADCAST_PERMISSION"/>
最后打印如下:
2.系统的广播
1.实现手机开机时的广播。
首先需要创建一个Recevier。
public class MyBootComplete extends BroadcastReceiver{ private static final String TAG = "MyInfo"; @Override public void onReceive(Context context, Intent intent) { Intent service = new Intent(context,MyService.class); context.startService(service); Log.i(TAG,"the Boot has Start!"); } }
在AndroidMainfest中注册,开机广播:
<receiver android:name=".MyBootComplete"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </receiver>
而且需要注册Service(因为我们模拟的是开机时,启动一个Service),然后需要提醒用户要获取的权限:
<service android:name=".MyService"/> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
以上,编写完成后,重启模拟器,便可以看到以下的Log信息:
07-22 07:44:02.328 741-741/com.app.wangpei.wangpeiapp I/MyInfo﹕ the Boot has Start! 07-22 07:44:02.332 741-741/com.app.wangpei.wangpeiapp I/MyInfo﹕ Service is Start! 07-22 07:44:02.332 741-741/com.app.wangpei.wangpeiapp I/MyInfo﹕ onStartCommand is start!
3.总结
1.使用广播的大体步骤:
1.首先,创建一个类去继承BroadCast Recevier这个类。
2.然后,在重写的方法onRecive()中去编写当广播发起时们需要进行的程序逻辑。
public class SecendRecevier extends BroadcastReceiver { private static final String Tag = "MyInfo"; @Override public void onReceive(Context context, Intent intent) { String msg = getResultExtras(true).getString("msg"); Log.i(Tag, "SecendRecevier: " + msg); Bundle bundle = new Bundle(); bundle.putString("msg",msg + "@SecendReceiver"); setResultExtras(bundle); } }
3.注册,有2中方法
1.静态方法:在AndroidMainfest中去注册
<!-- 系统开机广播 --> <receiver android:name=".boot.MyBootComplete"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </receiver>
注意:需要权限时,或者需要通知用户时,必须要加上需要使用的权限信息。
2.动态方法:在Activity中去用代码注册
// broadCast = new MyBroadCast(); // IntentFilter filter = new IntentFilter(); // filter.addAction("android.intent.action.MY_BROADCAST"); // registerReceiver(broadCast,filter);
以上2中方法皆可以达到使用广播的目的, 但是是有所不同的:具体是,静态注册的广播只要一开机,便一直处于在监听的状态中,不会受到当前应用的影响。而动态的注册则是根据当前的Activity来决定其状态。所以在动态注册的时候,假如你没有在Activity撤销的时候调用
// unregisterReceiver(broadCast);
则,系统会抛出一个异常,所以我们需要这样来解决:
@Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(broadCast); }
4.使用(假如是点击事件的话,则这样使用)
public void send(View view) { //普通广播 Intent intent = new Intent("android.intent.action.MY_BROADCAST"); intent.putExtra("msg","hello Recevier!"); sendBroadcast(intent); //有序广播 Intent intent = new Intent("android.intent.action.MY_BROADCAST"); intent.putExtra("msg","my world"); sendOrderedBroadcast(intent,"wangpei.permission.MY_BROADCAST_PERMISSION"); }