Android_BroadcastReceiver(二)

来源:互联网 发布:jq 加载js 跨域 编辑:程序博客网 时间:2024/05/29 04:52

如果你看过我写的第一篇Android_BroadcastReceiver(一),那么你一定了解到广播分为标准广播和有序广播。下面我们就来学习一下发送自定义广播:
发送标准广播
发送一个自定义的广播的主要步骤是:
1、自定义类MyBroadcastReceiver继承BroadcastReceiver类,重写onReceive()方法。
2、在AndroidManifest.xml文件中注册。
3、在MainActivity中点击一个按钮发送指定的广播。

以下是具体代码的实现
1、

public class AnotherBroadcastReceiver extends BroadcastReceiver {    @Override    public void onReceive(Context context, Intent intent) {        Toast.makeText(context, "receiver in AnotherBroadcastReceiver", Toast.LENGTH_LONG).show();    }}

2、

<receiver android:name=".MyBroadcastReceiver">            <intent-filter >                <action android:name="com.example.broadcasttest.MY_BROADCAST"/>            </intent-filter>        </receiver>

3、

public class MainActivity extends Activity {    private Button sendBroadcast;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        sendBroadcast= (Button) findViewById(R.id.button);        sendBroadcast.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {            //由代码可以看出发送一个广播是用Intent,我们就可以用Intent携带一些数据。                Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");                sendBroadcast(intent);            }        });    }}

发送有序广播
有序广播的发送其实跟标准广播的发送大概是一样的。有序广播的发送如下:
有序广播的发送

我们都知道有序广播是有优先级的,优先级越高,那么得到广播越早,也可以拦截广播或者篡改数据。
那么如何设置优先级的?如下图:

设置有序广播优先级

最为程序猿的我们来说,特别是对于我这种有强迫症的人来说,我当然愿意是自己程序拥有最高的优先级。
并且让,后面的接收相同的广播的程序都不能接收到。那么你就要这么办了:

阻止广播的传播

有序广播的接收者们的接收顺序
通过配置IntentFilter的priority可以设置各个广播接收者的优先级,priority的值越高,则优先级越高,则更加优先接收到广播
动态注册广播接收者时,通过IntentFilter对象的setPriority()方法配置,
静态注册时,为节点配置android:priority属性即可
官方推荐priority值不超过1000,实际开发时,为了抢占优先级,可以使用Integer.MAX_VALUE
当多个广播接收者的priority值相同时,动态注册的广播接收者的优先级高于静态注册的广播接收者
如果多个动态注册的广播接收者的priority值相同,先注册的先接收,后注册的后接收
如果多个静态注册的广播接收者的priority值相同,则根据各广播接收者所在的应用程序的包名进行排序

如何让广播接收者尽量获取更高的优先级
1) 指定最大值的priority
2) 可行的情况下,设置排序可以更靠前的包名
3) 使用静态注册的方式,接收“系统开机”的广播,并且在接收到该广播后,使用动态注册的方式注册广播接收者

有序广播的拦截
在广播接收者处理广播时,调用abortBroadcast()可以终止广播向后继续传递,则会导致优先级更低的广播接收者不会收到该广播

有序广播的篡改
在有序广播的传递过程中,可以通过setResult???()配置数据,优先级更低的广播接收者可以通过匹配的getResult???()获取这些数据,甚至进行篡改,而后续的接收者会收到篡改后的数据

使用本地广播
当我们的程序中使用广播发送一些关键性的数据有可能被其他的应用程序截取,或者 其他的程序不能地向我们的广播接收器里发送各种垃圾广播。为了能够简单的解决广播的安全性问题,Android引入了一套本地广播机制,使用这个机制发出的广播只能够在应用程序的内部进行传递,并且广播接收器也只能接收来自本应用程序发出的广播。这样所有的安全性问题就不存在了。

public class MainActivity extends Activity {    private Button sendOrderBroadcast;    private IntentFilter intentFilter;    private LocalReceiver localReceiver;    private LocalBroadcastManager localBroadcastManager;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        //获取localBroadcastManager的实例        localBroadcastManager = LocalBroadcastManager.getInstance(this);        //获取点击按钮        sendOrderBroadcast = (Button) findViewById(R.id.button);        sendOrderBroadcast.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                Intent intent = new Intent("com.example.broadcasttest.LOCAL_BROADCAST");                localBroadcastManager.sendBroadcast(intent);            }        });        intentFilter = new IntentFilter();        intentFilter.addAction("com.example.broadcasttest.LOCAL_BROADCAST");        localReceiver = new LocalReceiver();        localBroadcastManager.registerReceiver(localReceiver, intentFilter);    }    class LocalReceiver extends BroadcastReceiver {        @Override        public void onReceive(Context context, Intent intent) {            Toast.makeText(context, "receiverd local broadcast", Toast.LENGTH_LONG).show();        }    }    @Override    protected void onDestroy() {        super.onDestroy();        unregisterReceiver(localReceiver);    }}

注意点
本地广播注意点

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 遇到吸毒者拦路威胁要钱怎么办 开车遇见拦路要钱的怎么办 高速上有人拦车怎么办 马路上有人拦车怎么办 苹果手机下截软件要钱怎么办 孩子在学校问同学要钱怎么办 在学校被同学要钱怎么办 把人家店砸了要怎么办 外汇出金不到账怎么办 把罚款单弄丢了怎么办 在12306买不到下铺怎么办有 地铁票买反了怎么办 香港买错特惠票怎么办 到达迪拜t3 后怎么办 海藻面膜调多了怎么办 被鸡爪子抓伤了怎么办 被鸡抓伤肿了怎么办 护士电子化没有激活码怎么办 窗帘盒螺丝掉了怎么办 窗帘的环扣掉了怎么办 门式起重吊装行车脱轨怎么办 在日本丢了东西怎么办 在日本钱包丢了怎么办 被起诉后没钱还怎么办 分期付款卖车打不起车款怎么办 地铁票买多了怎么办 工伤陪护费没有发票怎么办 工伤医疗费报销单位不盖章怎么办 家里的led灯坏了怎么办 吊顶led灯坏了怎么办 客厅空了一面墙怎么办 轨道灯的轨道不够长怎么办 奔驰大灯不亮了怎么办 led顶灯不亮了怎么办 吸顶灯led灯坏了怎么办 车底盘塑料被刮怎么办 汽车门电机坏了怎么办 宁波北仑普高差三分该怎么办 上班的地方甲醛味很重怎么办 公司不给员工交社保怎么办 户口转到学校毕业了怎么办