android 自定义广播 总是被系统先接收,Android学习笔记(十四)——自定义广播...

//此系列博文是《第一行Android代码》的学习笔记,如有错漏,欢迎指正!

我们除了可以通过广播接收器来接收系统广播, 还可以在应用程序中发送自定义的广播。下面我们来分别试一试发送自定义的标准广播和有序广播。

一、标准广播:

1)在发送广播之前,我们还是需要先定义一个广播接收器来准备接收此广播才行:

2b65ef29a5872cc0e4771c25889edd04.gif

6a087676c59fa8b19d76e6bb55a32902.gif

1 public class MyBroadcastReceiver extendsBroadcastReceiver {2 @Override3 public voidonReceive(Context context, Intent intent) {4 Toast.makeText(context, "弄啥子咧", Toast.LENGTH_SHORT).show();5 }6 }

View Code

我们新建一个 MyBroadcastReceiver继承自 BroadcastReceiver,当它接收到信息时就发送了一个文本。

2)在manifest文件中注册此广播接收器:

2b65ef29a5872cc0e4771c25889edd04.gif

6a087676c59fa8b19d76e6bb55a32902.gif

1

2

3

4

5

View Code

在application标签下加上上述代码。

3)修改布局文件:在布局文件中加入一个button用于触发;

4)修改主活动代码:

2b65ef29a5872cc0e4771c25889edd04.gif

6a087676c59fa8b19d76e6bb55a32902.gif

1 @Override2 protected voidonCreate(Bundle savedInstanceState) {3 super.onCreate(savedInstanceState);4 setContentView(R.layout.activity_main);5 Button button =(Button) findViewById(R.id.button);6 button.setOnClickListener(newView.OnClickListener() {7 @Override8 public voidonClick(View v) {9 Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");10 sendBroadcast(intent);11 }12 });13 }

View Code

运行结果如下:

20180110185253330126.jpg

二、有序广播:

为了试验有序广播,我们新建一个BroadCastTest2,代码和BroadCast相似,把MyBroadcastReceiver类改成AnotherBroadcastReceiver类,相应地把toast的文本修改,便于区别。主活动代码如下:

2b65ef29a5872cc0e4771c25889edd04.gif

6a087676c59fa8b19d76e6bb55a32902.gif

1 @Override2 protected voidonCreate(Bundle savedInstanceState) {3 super.onCreate(savedInstanceState);4 setContentView(R.layout.activity_main);5 Button button =(Button) findViewById(R.id.button);6 button.setOnClickListener(newView.OnClickListener() {7 @Override8 public voidonClick(View v) {9 Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");10 sendOrderedBroadcast(intent, null);11 }12 });13 }

View Code

可以看到,发送有序广播只需要改动一行代码,即将 sendBroadcast()方法改成sendOrderedBroadcast()方法。sendOrderedBroadcast()方法接收两个参数,第一个参数仍然是Intent,第二个参数是一个与权限相关的字符串,这里传入 null 就行了。

既然是有序的,意味着我们可以指定广播接收器的顺序,这里只要在manifest中加入下列代码即可改变接收器的优先顺序:

2b65ef29a5872cc0e4771c25889edd04.gif

6a087676c59fa8b19d76e6bb55a32902.gif

1

2

3

4

5

View Code

我们通过 android:priority属性给广播接收器设置了优先级,优先级比较高的广播接收器就可以先收到广播。程序运行如下:

20180110185253334032.jpg 

20180110185253335009.jpg

如果在优先级高的广播接收器中的onReceive()方法中的最后调用了 abortBroadcast()方法, 就表示将这条广播截断, 后面的广播接收器将无法再接收到这条广播。

abortBroadcast();

三、使用本地广播:

之前我们发送和接收的广播全部都是属于系统全局广播, 即发出的广播可以被其他任何的任何应用程序接收到,并且我们也可以接收来自于其他任何应用程序的广播。这样就很容易会引起安全性的问题,比如数据的泄露。为了能够简单地解决广播的安全性问题,Android 引入了一套本地广播机制,使用这个机制发出的广播只能够在应用程序的内部进行传递, 并且广播接收器也只能接收来自本应用程序发出的广播。

本地广播主要就是使用了一个 LocalBroadcastManager 来对广播进行管理,并提供了发送广播和注册广播接收器的方法:

2b65ef29a5872cc0e4771c25889edd04.gif

6a087676c59fa8b19d76e6bb55a32902.gif

1 public class MainActivity extendsActivity {2 privateIntentFilter intentFilter;3 privateLocalReceiver localReceiver;4 privateLocalBroadcastManager localBroadcastManager;5 @Override6 protected voidonCreate(Bundle savedInstanceState) {7 super.onCreate(savedInstanceState);8 setContentView(R.layout.activity_main);9 localBroadcastManager = LocalBroadcastManager.getInstance(this);10 //获取实例

11 Button button =(Button) findViewById(R.id.button);12 button.setOnClickListener(newView.OnClickListener() {13 @Override14 public voidonClick(View v) {15 Intent intent = new Intent("com.example.broadcasttest.LOCAL_BROADCAST");16 localBroadcastManager.sendBroadcast(intent); //发送本地广播

17 }18 });19 intentFilter = newIntentFilter();20 intentFilter.addAction("com.example.broadcasttest.LOCAL_BROADCAST");21 localReceiver = newLocalReceiver();22 localBroadcastManager.registerReceiver(localReceiver, intentFilter);23 //注册本地广播监听器

24 }25 @Override26 protected voidonDestroy() {27 super.onDestroy();28 localBroadcastManager.unregisterReceiver(localReceiver);29 }30 class LocalReceiver extendsBroadcastReceiver {31 @Override32 public voidonReceive(Context context, Intent intent) {33 Toast.makeText(context, "received local broadcast",34 Toast.LENGTH_SHORT).show();35 }36 }37 }

View Code

其实这基本上就和我们前面所学的动态注册广播接收器以及发送广播的代码是一样。只不过现在首先是通过 LocalBroadcastManager的 getInstance()方法得到了它的一个实例,然后在注册广播接收器的时候调用的是 LocalBroadcastManager的 registerReceiver()方法,在发送广播的时候调用的是 LocalBroadcastManager的 sendBroadcast()方法,仅此而已。这里我们在按钮的点击事件里面发出了一条 com.example.broadcasttest.LOCAL_BROADCAST 广播,然后在 LocalReceiver 里去接收这条广播。

//End.

原文:http://www.cnblogs.com/Vincent-Bryan/p/5399774.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值