美文网首页Android开发经验谈Android技术知识Android知识
Android学习笔记4 四大组件之BroadcastRecei

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

作者: RumbleTsc | 来源:发表于2016-07-10 14:01 被阅读428次

    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.注册广播

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

            <!--接收器-->
            <receiver android:name=".receiver.MyReceiver">
                <intent-filter>
                    <action android:name="com.jackaltsc.android.actiontest"/>
                </intent-filter>
            </receiver>
    

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

    输出结果如下:

    输出结果

    补充一点,我们在第三步是在清单文件里注册广播的,这里还有另外一种方法是在代码里设置。我们修改之前的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.清单文件里注册

    <receiver android:name=".receiver.MessageReceiver">
         <intent-filter android:priority="1000">
              <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
         </intent-filter>
    </receiver>
    

    3.添加接收短信的权限

    <uses-permission android:name="android.permission.RECEIVE_SMS"/>
    

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

    读取短信内容

    四、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 四大组件之BroadcastRecei

        本文链接:https://www.haomeiwen.com/subject/vwgljttx.html