android四大组件之广播接收者(一)

由于4月初要离职了,在找新工作,发现很多企业的招聘信息都有“附上自己的技术博客可以加分”类似的说明,正好最后的这段时间会比较闲,所以打算整理一下以前记录的一些笔记发上来,也算是回顾一下。由于这些笔记或多或少的参考了其他资料,所以本人不拥有其版权,可以随便转载,能注明出处最好,不注明也无所谓。顺便求个Android开发的职位,坐标深圳,邮箱[email protected]

一、概念

BroadCastReceiver,广播接收者,android四大组件之一,它就像是生活中的收音机可以接收电台的广播一样,可以接收系统的广播或者用户自定义的广播。简单来说,广播接收者的作用有:
1.接收系统的广播,比如系统启动完成、电池低电量或者拨打电话等,我们可以通过一定的配置接收系统发送的这些广播从而知道这些事件的发生;
2.接收应用发送的广播,可以是本应用也可以是其他应用,从而实现进程内或者进程间的通信,举个例子,如果你的手机安装了百度全家桶或者阿里全家桶或者企鹅全家桶等等这些豪华套餐,只要你启动其中一个应用,它就可以自定义一个广播然后发送出去,然后全家桶的其他成员接受到这个广播之后就可以全部在后台启动起来,干一些为人民服务的好事。(当然这只是实现方式之一,要实现这个效果还有很多其他的方式)

二、广播接收者的简单使用(静态注册广播接收者)

广播接收者作为四大组件之一,一般来说需要在清单文件中配置,但是特殊的广播接收者也可以在程序中动态注册。例子是监听打电话的事件,在用户拨打电话的时候弹出一个吐司:
1.创建广播接收者,也就是创建一个class,让它继承BroadcastReceiver

2.在清单文件中配置广播接收者,用android studio创建的四大组件IDE会自动在清单文件中注册
android四大组件之广播接收者(一)_第1张图片
但是广播接收者的监听事件还是需要开发者手动配置,监听外拨电话的广播接收者配置如下
 
    
  1. android:name=".PhoneReceiver"
  2. android:enabled="true"
  3. android:name="android.intent.action.NEW_OUTGOING_CALL"/>
需要注意的是,监听广播往往需要添加响应的权限,监听外拨电话的声明如下,6.0以上需要动态申请权限:
 
    
  1. android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
3.在创建的广播接收者中重写onReceive方法
 
    
  1. @Override
  2. public void onReceive(Context context, Intent intent) {
  3. Toast.makeText(context,"正在打电话",Toast.LENGTH_SHORT).show();
  4. }
大功告成,运行结果:
android四大组件之广播接收者(一)_第2张图片

三、动态注册广播接收者

依然是接收打电话的广播,动态注册广播接收者的步骤如下:
1.新建class继承自BroadcasReceiver

2.重写onReceive方法
 
    
  1. @Override
  2. public void onReceive(Context context, Intent intent) {
  3. Toast.makeText(context,"收到广播啦~",Toast.LENGTH_SHORT).show();
  4. }
3.在代码中注册广播接收者
 
    
  1. IntentFilter filter = new IntentFilter();
  2. filter.addAction("android.intent.action.NEW_OUTGOING_CALL");
  3. receiver = new DynamicReceiver();
  4. registerReceiver(receiver,filter,"android.permission.PROCESS_OUTGOING_CALLS",null);
4.动态注册的广播接收者需要在使用完成后或者activity退出的时候手动注销
 
     
  1. @Override
  2. protected void onDestroy() {
  3. super.onDestroy();
  4. unregisterReceiver(receiver);
  5. }
其中registerReceiver是重载的方法,其中一个是上面带四个参数的,另一个只带有前两个参数。第一个为需要注册的广播接收者,第二个为IntentFilter实例对象,其作用与清单文件中的intent-filter对应,第三个为需要的权限,最后一个是一个handler对象,标记的是接收广播的线程,可以是null,为null时时主线程。
运行结果:
android四大组件之广播接收者(一)_第3张图片

四、自定义广播

自定义广播,主要是定义一个action,然后在广播接收者中配置这个action。代码比较简单,直接上
 
    
  1. package com.example.study;
  2. import android.content.BroadcastReceiver;
  3. import android.content.Context;
  4. import android.content.Intent;
  5. import android.content.IntentFilter;
  6. import android.support.v7.app.AppCompatActivity;
  7. import android.os.Bundle;
  8. import android.widget.Toast;
  9. public class MainActivity extends AppCompatActivity {
  10. private MyReceiver receiver;
  11. @Override
  12. protected void onCreate(Bundle savedInstanceState) {
  13. super.onCreate(savedInstanceState);
  14. setContentView(R.layout.activity_main);
  15. //先注册广播接收者,再发广播,记得退出时注销广播接收者
  16. IntentFilter filter = new IntentFilter("con.kwell.myaction");
  17. receiver = new MyReceiver();
  18. registerReceiver(receiver,filter);
  19. //带有Action的Intent对象
  20. Intent intent = new Intent("con.kwell.myaction");
  21. //发送广播
  22. sendBroadcast(intent);
  23. }
  24. class MyReceiver extends BroadcastReceiver{
  25. @Override
  26. public void onReceive(Context context, Intent intent) {
  27. Toast.makeText(context,"收到了自己发的广播",Toast.LENGTH_SHORT).show();
  28. }
  29. }
  30. @Override
  31. protected void onDestroy() {
  32. super.onDestroy();
  33. //注销广播接收者
  34. unregisterReceiver(receiver);
  35. }
  36. }
运行结果:
android四大组件之广播接收者(一)_第4张图片

五、有序广播与无序广播

上面演示的都是无序广播,所有广播接收者接收无序广播的顺序是不确定的,其特点是效率高,但是无法使用setResult和getResult以及中断广播这些方法。发送无序广播的方法是sendBroadcast()
 
    
  1. package com.example.study;
  2. import android.content.BroadcastReceiver;
  3. import android.content.Context;
  4. import android.content.Intent;
  5. import android.content.IntentFilter;
  6. import android.support.v7.app.AppCompatActivity;
  7. import android.os.Bundle;
  8. import android.widget.Toast;
  9. public class MainActivity extends AppCompatActivity {
  10. private MyReceiver receiver;
  11. private MyReceiver receiver2;
  12. @Override
  13. protected void onCreate(Bundle savedInstanceState) {
  14. super.onCreate(savedInstanceState);
  15. setContentView(R.layout.activity_main);
  16. //先注册广播接收者,再发广播,记得退出时注销广播接收者
  17. IntentFilter filter = new IntentFilter("con.kwell.myaction");
  18. //设置优先级为最高
  19. filter.setPriority(Integer.MAX_VALUE);
  20. receiver = new MyReceiver(1);
  21. registerReceiver(receiver,filter);
  22. //另一个广播接收者,优先级设置为1000
  23. IntentFilter filter2 = new IntentFilter("con.kwell.myaction");
  24. filter2.setPriority(1);
  25. receiver2 = new MyReceiver(2);
  26. registerReceiver(receiver2,filter2);
  27. //带有Action的Intent对象
  28. Intent intent = new Intent("con.kwell.myaction");
  29. //发送无序广播
  30. sendBroadcast(intent);
  31. }
  32. class MyReceiver extends BroadcastReceiver{
  33. private int id;
  34. public MyReceiver(int id){
  35. this.id = id;
  36. }
  37. @Override
  38. public void onReceive(Context context, Intent intent) {
  39. Toast.makeText(context,"广播接收者"+id+"收到了自己发的广播",Toast.LENGTH_SHORT).show();
  40. //中断这个广播
  41. abortBroadcast();
  42. }
  43. }
  44. @Override
  45. protected void onDestroy() {
  46. super.onDestroy();
  47. //注销广播接收者
  48. unregisterReceiver(receiver);
  49. unregisterReceiver(receiver2);
  50. }
  51. }
运行结果:
android四大组件之广播接收者(一)_第5张图片
由此可以看到,我们设置的优先级以及中断广播并没有起作用,广播接收者2依旧接收到了广播。
有序广播的特点是所有的广播接收者按照优先级依次接收广播,优先级高的先接受到,它可以获取Intent的数据并且可以对其进行修改,然后再向优先级低的广播接收者进行传递,也可以中断此次广播。
对应两种注册方式,广播接收者的优先级可以在清单文件中配置,也可以在动态注册的时候设置,清单文件配置实例
 
    
  1. android:name=".MyReceiver"
  2. android:enabled="true"
  3. android:exported="true">
  4. android:priority="1000">
  5. android:name="android.intent.action.INPUT_METHOD_CHANGED"/>
清单文件配置的优先级大小从-1000到1000,数值越大优先级越高。发送有序广播的方法是sendOrderedBroadcast,把上面的例子改造一下,只需要把发送广播的一行替换成
 
    
  1. //发送有序广播
  2. sendOrderedBroadcast(intent,null);
运行结果
android四大组件之广播接收者(一)_第6张图片
可以看到,优先级高的广播接收者1顺利的把本次广播中断了,2没有再接收到广播。
未完待续....


你可能感兴趣的:(android基础,android,广播接收者,四大组件)