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); }}
注意点
- Android_BroadcastReceiver(二)
- android_BroadcastReceiver
- Android_BroadcastReceiver详解
- Android_BroadcastReceiver(一)
- Android_BroadcastReceiver(三)
- android_BroadcastReceiver 广播机制
- Android_BroadcastReceiver广播接收者详解及应用
- Android_BroadcastReceiver广播接收者详解及应用
- (二)
- (二)
- 二
- 《二》
- 二
- 二
- 二
- 二
- 二
- 二
- Js apply方法详解
- Android Invalid maximum heap size: -Xmx 解决方法
- MySQL中char与varchar数据类型选择原则
- java常用排序算法
- 【自定义view系列】View的measure过程
- Android_BroadcastReceiver(二)
- Java反射
- CnSkype for Business
- 泡泡窗口实现下拉菜单,以及改变布局高度
- 序列帧动画
- JsonObject生成Json字符串,并且解析为对象-----JsonReader解析Json字符串
- activeMQ
- OpenCV_2.4.9图像元素遍历六种方法的源码及性能对比
- Public Function Merge2(rng As Range, splitter As String) As String