首先看一下什么是 BroadcastReceiver
BroadcastReceiver:直译是“广播接收者”,所以它的作用是用来接收发送过来的广播的。
那我们有必要知道:什么是广播。广播,我的理解就是系统中消息的一种变种;就是当一个事件发生时,比如,系统突然断网,系统就发一个广播消息给所有的接收者,所有的接收者在得到这个消息之后,就知道,啊哦,现在没网络了,我的程序应该怎么办,比如显示默认图片、提示用户等。前面,我们说了,BroadcastReceiver就是一个广播消息接收者。
另外我还要提一下,广播之间信息的传递是通过Intent对象来传递的;在《详解Intent》系列文章中,我讲了,Intent调用分为显示调用的隐式调用两种,由于这里能通知到所有的接收者,所以肯定不能利用显示调用,只有利用隐式调用Intent对象了。(这里的隐式调用,并不是真正意义上的Intent隐式调用,因为Intent隐式调用,当出现很多匹配应用时,会以列表形式提示用户选择一个启动,而这里不同的地方在于,当有很多匹配项时,会给所有的匹配项都发一个消息,我说隐式调用,只是方便大家理解构造Intent的方法,即必须利用构造隐式Intent的方法来构造)
1,创建一个空项目,然后new一个新的BroadcastReceiver(new--->other)MyReceiver.java
1 public class MyReceiver extends BroadcastReceiver { 2 3 //用于隐式调用与注册 4 public static final String ACTION = "examples.ouc.com.broadcastreceiver.intent.action.MyReceiver"; 5 public MyReceiver() { 6 } 7 8 //监控广播操作是否完成 9 @Override 10 public void onReceive(Context context, Intent intent) { 11 12 //通过intent传递信息 13 System.out.println("Receive news, and the news is :" + intent.getStringExtra("data")); 14 } 15 }
需要把AndroidManefest中的这句话去掉,否则它是默认一直绑定的
<receiver android:name=".MyReceiver11" android:enabled="true" android:exported="true"></receiver>
2,然后在页面中添加几个按钮,用于绑定,解除绑定,和发送
<Button android:id="@+id/btnSendMessage" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="发送消息" /> <Button android:id="@+id/btnReg" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="注册接收器" /> <Button android:id="@+id/btnUnreg" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="注销接收器" />
3,配置broadcast服务
1 public class MainActivity extends AppCompatActivity implements View.OnClickListener { 2 3 @Override 4 protected void onCreate(Bundle savedInstanceState) { 5 super.onCreate(savedInstanceState); 6 setContentView(R.layout.activity_main); 7 8 findViewById(R.id.btnSendMessage).setOnClickListener(this); 9 findViewById(R.id.btnReg).setOnClickListener(this); 10 findViewById(R.id.btnUnreg).setOnClickListener(this); 11 } 12 13 @Override 14 public void onClick(View v) { 15 switch (v.getId()){ 16 case R.id.btnSendMessage: 17 //Intent i = new Intent(this,MyReceiver.class); 18 //必须采用隐式的 19 Intent i = new Intent(MyReceiver.ACTION); 20 i.putExtra("data","iCyhuSky"); 21 sendBroadcast(i); 22 break; 23 24 case R.id.btnReg: 25 //如果没有绑定,就开启 26 if (receiver== null){ 27 receiver = new MyReceiver(); 28 registerReceiver(receiver,new IntentFilter(MyReceiver.ACTION)); 29 } 30 break; 31 32 case R.id.btnUnreg: 33 //如果开启了,就关闭 34 if (receiver!=null){ 35 unregisterReceiver(receiver); 36 receiver = null; 37 } 38 break; 39 40 } 41 } 42 43 //标志服务是否绑定 44 private MyReceiver receiver = null; 45 }
4,然后可发布运行了
开始时,点击“发送消息”,后台logcat没有输出
点击“注册接收器”,然后点击“发送消息”,后台logcat会输出我们传递的那句话
点击“注销接收器”,然后点击“发送消息”,后台logcat就没有输出了!
5,优先级问题:
(1)默认状态下:
如果两个receiver指明到同一个action,那么后创建的优先级比较高,先执行代码
(2)也可我们人工代码修改优先级
第一个接收器:
1 <receiver android:name=".MyReceiver1"> 2 <intent-filter android:priority="9"> 3 <action android:name="......" 4 </intent-filter> 5 </receiver>
第二个接收器:
1 <receiver android:name=".MyReceiver2"> 2 <intent-filter android:priority="9"> 3 <action android:name="......" 4 </intent-filter> 5 </receiver>
从这里我们可以发现,二者除了名字不同外,只有priority有区别,值比较大的优先执行.
priority汉语就是优先级的意思。。。。
(3)当我们在优先级比较高的接收器中添加这样一句时(红色),其他的将不再执行:
1 public void onReceive(Context context, Intent intent) { 2 3 //通过intent传递信息 4 System.out.println("Receive news, and the news is :" + intent.getStringExtra("data")); 5 abortBroadcast(); 6 }
如果只是这样会报错,需要修改MainActivity中的发生发送按钮
1 public void onClick(View v) { 2 switch (v.getId()){ 3 case R.id.btnSendMessage: 4 //Intent i = new Intent(this,MyReceiver.class); 5 //必须采用隐式的 6 Intent i = new Intent(MyReceiver.ACTION); 7 i.putExtra("data","iCyhuSky"); 8 // sendBroadcast(i); 9 sendOrderedBroadcast(i,null); 10 break;