Android学习笔记4 四大组件之BroadcastReceiver

Android系统四大组件,Activity(活动)提供界面负责用户交互,Service(服务)没有用户界面主要是在后台执行任务,Content Provider(内容提供者)用于不同应用间数据共享,今天介绍的是最后一个,BroadcastReceiver(广播接收器)。

一、 BroadcastReceiver是什么
二、 BroadcastReceiver基本用法
三、 BroadcastReceiver例子
四、 BroadcastReceiver总结

一、 BroadcastReceiver是什么

简单来说,BroadcastReceiver广播接收器就是一个全局的监听器,它可以监听用户自己开发的程序和系统的发出的广播消息。具体来说,我们的手机在使用过程中肯定会经历很多的状态,比如电池电量低、系统的时间变化、系统收到短信等等,这些状态发生时系统会对外发送标准广播,我们通过继承BroadcastReceiver新建自己的广播接收器来监听这些标准广播,即可在特定的时候完成指定的操作。

二、 BroadcastReceiver基本用法

这里先假设我们是自己要发送条广播,那么我们首先要做的是创建Intent对象,在Intent里使用setAction方法来设置通知的标识,用以区分广播,同时可以在Intent里携带数据,最后调用方法sendBroadcast来发送广播。

1.发送广播

下面的代码展示了发送广播,代码的逻辑就是点击按钮时发送一条广播。

public class BroadcastActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.layout_activity_bc);

        //点击按钮时
        Button btnSendBC = (Button) findViewById(R.id.btn_send_bc);
        btnSendBC.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                //实例化Intent
                Intent mIntent = new Intent();
                //设置标识
                mIntent.setAction("com.jackaltsc.android.actiontest");
                //携带数据
                mIntent.putExtra("msg", "自定义的广播消息");
                //开始发送
                sendBroadcast(mIntent);

            }
        });
    }
}

2.接收广播

为了接收到广播,必须新建继承BroadcastReceiver的子类,在里面实现onReceive方法来处理逻辑。

public class MyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {

        Log.e("---bbb---", "接收到广播内容为:" + intent.getStringExtra("msg"));

    }
}

3.注册广播

我们有广播发送,有广播接收,那么怎么把两者关联起来呢?这时,就需要在清单文件里对接收器进行注册。

        
        
            
                
            
        

可以看到,我们把接收器和发送广播时的标识关联了起来,这样广播接收器就可以接收到通知了。

输出结果如下:

输出结果

补充一点,我们在第三步是在清单文件里注册广播的,这里还有另外一种方法是在代码里设置。我们修改之前的Activity里的代码,同时删除掉清单文件里的Receiver注册的部分代码,同样可以看到结果。

public class BroadcastActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.layout_activity_bc);

        //点击按钮时
        Button btnSendBC = (Button) findViewById(R.id.btn_send_bc);
        btnSendBC.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                //过滤器
                IntentFilter filter = new IntentFilter("com.jackaltsc.android.actiontest");
                //实例化
                MyReceiver myReceiver = new MyReceiver();
                //注册接收器
                registerReceiver(myReceiver, filter);

                //实例化Intent
                Intent mIntent = new Intent();
                //设置标识
                mIntent.setAction("com.jackaltsc.android.actiontest");
                //携带数据
                mIntent.putExtra("msg", "自定义的广播消息");
                //开始发送
                sendBroadcast(mIntent);

            }
        });
    }
}

三、 BroadcastReceiver例子

前面我们提到,系统在很多特定的时候会发送一些广播,我们选择特定的广播进行处理,可以实现我们的需要。

下面展示下怎么获取手机短信内容。

1.新建广播接收器

public class MessageReceiver extends BroadcastReceiver {

    private final String action = "android.provider.Telephony.SMS_RECEIVED";

    @Override
    public void onReceive(Context context, Intent intent) {

        if (intent.getAction().equals(action)) {

            abortBroadcast();

            //用来存放结果的字符串
            StringBuilder sb = new StringBuilder();

            //取出信息内容的载体
            Bundle bundle = intent.getExtras();

            //如果内容不为空
            if (bundle != null) {

                //得到信息内容 是一段一段的
                Object[] pdus = (Object[]) bundle.get("pdus");

                //短信对象数组
                SmsMessage[] messages = new SmsMessage[pdus.length];
                for (int i = 0; i < pdus.length; i++) {
                    messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
                }

                //循环遍历短信数组 取出内容
                for (int i = 0; i < messages.length; i++) {

                    if (i == 0) {
                        sb.append("发件人:" + messages[i].getDisplayOriginatingAddress()
                                + "\n信息内容为:\n");
                    }
                    sb.append(messages[i].getDisplayMessageBody() + "\n");
                }

                Log.e("---sss---", sb.toString());

            }

        }

    }
}

2.清单文件里注册


     
          
     

3.添加接收短信的权限


最后可以看到输出结果如下:

Android学习笔记4 四大组件之BroadcastReceiver_第1张图片
读取短信内容

四、BroadcastReceiver总结

下面是对BroadcastReceiver的小结。

1.广播的两种注册方式

广播Broadcast的注册方式有两种,一种是在清单文件里静态注册,还有一种是在代码里动态注册,那么两种的区别是什么呢。 通过在配置文件里面注册广播属于常驻型广播,即便应用程序结束,一旦有了对应的广播过来,其还是会被激活;而在代码里注册的广播则是非常驻型广播,比如在oncreate方法里面注册一个广播,那么在ondestroy里就可以BroadcastReceiver.abortBroadcast()。对于第一种方法,我们需要养成一个良好的习惯:在Activity进入停止或者销毁状态的时候使用unregisterReceiver方法将注册的BroadcastReceiver注销掉。如果在清单文件里静态注册,那么该对象的实例在onReceive被调用之后就会在任意时间内被销毁。也就是说,我们并需要担心静态注册的BroadcastReceiver的销毁问题。

2.广播的两种类型

广播Broadcast有两种类型,我们通过方法sendBroadcast()发送的是无序广播,它是完全异步的,可以同时被所有接收者接收到,消息传递效率高,但是接收者不能把处理结果传递给下一个接收者,且不能终止广播的继续传播。通过sendOrderedBroadcast()发送的是有序广播,系统会根据接收器声明的优先级别按顺序逐个接收,先接收广播的可以使用abortBroadcast()方法终止Broadcast的继续传播,此外,先接收到广播的还可以通过方法setResultExtras来存数据到广播中,下一个接收到的可以获取存入的数据。

3.其它注意点

在新建自己的广播接收器时,我们要实现onReceive()方法,在里面完成自己的逻辑,这里不能做耗时的操作,建议是10s以内。

你可能感兴趣的:(Android学习笔记4 四大组件之BroadcastReceiver)