广播详解

来源:互联网 发布:仿微博php 编辑:程序博客网 时间:2024/04/25 19:55

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

标准广播(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所接收。
原创粉丝点击