广播详解

移动开发 waitig 464℃ 百度已收录 0评论

广播简介
上小学时,个高的学生负责敲钟,用于上下课。钟声响起,相当于向每个人发送了一个广播。广播有两种:标准/普通广播,有序广播。

标准广播(Normal broadcasts):在钟声响起之时,也就是向所有人发送了一条广播,所有人都能同一时刻收到,不考虑声音传播等问题,所以没有先后顺序可言,这类广播效率是最高的,也无法被截取。比如听到上课铃声的同学与老师都去上课。

有序广播(Ordered broadcasts):正所谓无规矩不成方圆,当下课铃声响起时,还需老师同意方能下课,甚至有的老师拖堂到下一节课。用专业术语描述就是:在同一时刻只有一个广播接收器能接受到该消息,当该广播接收器的逻辑处理完成后,广播才会继续往下传递,所以是有先后顺序的,并且前面的广播接收器还能截取正在传递的广播,不让他继续往下传递。

接受与发送广播

接受广播:

    Android系统有很多内置的广播,比如网络的变化,手机开机等,想要获取这些消息,就需要特定的接头暗号,例如:"天王盖地虎,宝塔镇河妖"。
public class MainActivity extends Activity{

        private IntentFilter filter;
        private BootBroadcastReceiver bootReceiver;
        private 
        @Override
        protected void onCreate (Bundle savedInstanceState){
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            filter=new IntentFilter();
            filter.addAction("android.intent.action.BOOT_COMPLETED");//接头暗号 开机广播
            bootReceiver=new BootBroadcastReceiver();
            registerReceiver(bootReceiver,filter);//代码注册广播
        }

        @Override
        protected void OnDestory(){
            super.onDestory();
            unregisterReceiver(bootReceiver);//注销广播
        }

        class BootBroadcastReceiver extends BroadcastReceiver{
            @Override
            public void onReceiver(Context context,Intent intent){
                //do something.
                ...
            }
        }

    }
依照上面的代码运行,肯定会报权限错误,开机运行是需要权限。
<user-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
在功能清单中添加上述权限,就可以达到设计的目标了。


发送广播:广播可以跨应用在同一台设备上传递消息。也就是说我在QQ发送的广播,微信可以接受。就像系统的广播,你可以接受一样。


    1》定义广播接收器
public class MyBroadcastReceiver extends BroadcastReceiver{
            @Override
            public void onReceiver(){
                //do  something 
                ...             
            }
        }
    当MyBroadcastReceiver接受到广播时,就会执行do something中的事情了,当然少不了注册广播,也就是接头暗语。

    2》注册广播
    <application>
            ...

            <receiver 
                android:name=".MyBroadcastReceiver">
                <intent-filter>         
                    <action android:name="com.hyco.yancy.MY_BR"/>
                </intent-filter>
            </receiver>
        </application>
    "com.hyco.yancy.MY_BR" 就是接头暗号了。

    3》发送广播
public class MainActivity extends Activity{
        private 
        @Override
        protected void onCreate (Bundle savedInstanceState){
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            Intent intent=new Intent("com.hyco.yancy.MY_BR");
            //intent 是可以通过键值对传递数据。
            sendBroadcast(intent);

        }

    }
这样就完成了一条广播的发送,只是普通的广播。


而有序广播只需要增加优先级,发送广播的方式改变。
<application>
            ...

            <receiver 
                android:name=".MyBroadcastReceiver">
                <intent-filter android:priority="100">          
                    <action android:name="com.hyco.yancy.MY_BR"/>
                </intent-filter>
            </receiver>
        </application>
    Intent intent=new Intent("com.hyco.yancy.MY_BR");
            //intent 是可以通过键值对传递数据。
        sendOrderedBroadcast(intent,null);
public class MyBroadcastReceiver extends BroadcastReceiver{
        @Override
        public void onReceiver(){
            //do  something 
            ... 
        abortBroadcast();//增加此方法,即可截断广播往下发送
        }
    }

按照上面的代码,继续增加广播接收器,完成一步一步的传递。同时要去掉abortBroadcast()方法。

拓展:在应用a中发送广播,在b应用中接受。注意:要保证应用没有被杀死,广播没有被注销。

本地广播

经过拓展即可知道,原来我自定的广播可以被别的应用所接收,这就很容易引起安全性问题。而本地广播就是为了解决这一个问题。

本地广播只能在所在的应用中发送与传递,使用起来也是极为方便。
public class MainActivity extends Activity{

        private IntentFilter filter;
        private LocalBroadcastReceiver localReceiver;
        private LocalBroadcastManager manager;
        private 
        @Override
        protected void onCreate (Bundle savedInstanceState){
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            manager=LocalBroadcastManager.getInstance(this);
            filter=new IntentFilter();
            filter.addAction("com.hyco.yancy.MY_BR");//接头暗号 开机广播
            localReceiver=new LocalBroadcastReceiver();
            manager.registerReceiver(localReceiver,filter);//代码注册广播

            //发送广播
            Intent intent=new Intent("com.hyco.yancy.MY_BR");
            //intent 是可以通过键值对传递数据。
            manager.sendBroadcast(intent);
        }

        @Override
        protected void OnDestory(){
            super.onDestory();
            manager.unregisterReceiver(localReceiver);//注销广播
        }

        class LocalBroadcastReceiver extends BroadcastReceiver{
            @Override
            public void onReceiver(Context context,Intent intent){
                //do something.
                ...
            }
        }

    }
只是多了一个本地广播管理者,可以按照这个方法测试,应用a的广播是否还能被应用b所接收。

本文由【waitig】发表在等英博客
本文固定链接:广播详解
欢迎关注本站官方公众号,每日都有干货分享!
等英博客官方公众号
点赞 (0)分享 (0)