android学习笔记之四:四大组件之BroadcastReceiver
来源:互联网 发布:模拟约瑟夫环 java 编辑:程序博客网 时间:2024/05/18 10:18
1.定义广播接收者
- 定义一个类继承BroadcastReceiver,并重写onReceive()方法。
@Overridepublic class SMSBroadCastReceiver extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { }}
- 在清单文件中配置该类(静态注册),指定接收的广播种类
<receiver android:name="com.example.broadcast.SMSBroadCastReceiver"> <intent-filter > <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter></receiver>
广播是通过intent发送的,intent中会携带一个action,系统会在所有清单文件中寻找,看哪一个广播接收者的intent-filter和广播中的intent是匹配的,那么这个广播接收者就会收到这条广播,它的onReceive方法就会执行。
BroadcastReceiver除了在清单文件中声明,也可以在代码中声明,使用registerReceiver方法动态注册Receiver
动态注册时,无须在AndroidManifest中注册receiver组件。直接在代码中通过调用Context的registerReceiver函数,可以在程序中动态注册BroadcastReceiver。registerReceiver的定义形式如下:
SMSBroadcastReceiver receiver = new SMSBroadcastReceiver();IntentFilter intentFilter= new IntentFilter();intentFilter.addAction("android.provider.Telephony.SMS_RECEIVED");registerReceiver(receiver, intentFilter);
动态注册的广播接收者,还需要在onDestroy()回调中取消注册
unregisterReceiver(receiver)。
2.发送自定义广播
- 创建自定义广播:
//创建一个传递消息的意图对象Intent intent = new Intent();//设置要广播的事件类型intent.setAction("com.example.broadcast.appointment");//设置广播的消息数据intent.putExtra("appointment", "明天天气晴朗,是约会的好日子......");//发送一个广播消息sendBroadcast(intent);
- 接收自定义广播:
public class MyBroadcastReceiver extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { String appointment = intent.getStringExtra("appointment"); Toast.makeText(context, appointment , 1).show(); }}
在AndroidManifest.xml中配置广播接收者:
<receiver android:name="com.example.broadcast.MyBroadcastReceiver"> <intent-filter> <action android:name="com.example.broadcast.appointment"> </intent-filter></receiver>
3.广播的两种类型
无序广播:所有跟广播的intent匹配的广播接收者都可以收到该广播,并且是没有先后顺序(同时收到)
- 接收者不能将处理结果传递给下一个接收者,并且无法终止广播Intent的传播。
- Context.sendBroadcast(intent);
有序广播:所有跟广播的intent匹配的广播接收者都可以收到该广播,但是会按照广播接收者的优先级来决定接收的先后顺序,优先级高的先收到,优先级低的后收到。
- 优先级别声明在 intent-filter 元素的 android:priority 属性中,取值范围:-1000~1000,优先级别也可以调用IntentFilter对象的setPriority()进行设置 。
- Context.sendOrderedBroadcast(intent);
- 结果接收者:所有广播接收者都接收到广播之后,它才接收,并且一定会接收
- abortBroadCast():阻止其他接收者接收这条广播,类似拦截,只有有序广播可以被拦截
4.使用本地广播
只在应用程序内部进行传递的广播,发送和接收都只在本应用程序有效。
本地广播是无法通过静态注册来实现的。因为静态注册是为了让程序未启动也能接收广播。本地广播是在本程序内进行
传递,肯定是已经启动了,因此也完全不需要静态注册。使用LocalBroadcastManager对广播进行管理,代码如下。
public class MainActivity extends Activity { private IntentFilter intentFilter; private LocalReceiver localReceiver; //本地广播数据类型实例 private LocalBroadcastManager localBroadcastManager; @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); supportRequestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); //获取本地广播实例 localBroadcastManager = LocalBroadcastManager.getInstance(this); Button button = (Button)findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent("com.example.broadcast.LOCAL_BROADCAST"); //发送本地广播。 localBroadcastManager.sendBroadcast(intent); } }); //新建intentFilter并给其action标签赋值。 intentFilter = new IntentFilter(); intentFilter.addAction("com.example.broadcast.LOCAL_BROADCAST"); //创建广播接收器实例,并注册。将其接收器与action标签进行绑定。 localReceiver = new LocalReceiver(); localBroadcastManager.registerReceiver(localReceiver,intentFilter); } //在onDestroy()方法中取消注册 @Override public void onDestroy(){ super.onDestroy(); //取消注册调用的是unregisterReceiver()方法,并传入接收器实例。 localBroadcastManager.unregisterReceiver(localReceiver); } class LocalReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context,Intent intent){ Toast.makeText(context,"这是本地广播接收器",Toast.LENGTH_SHORT).show(); } } }
- 本地广播的优势
- 可以明确地知道正在发送的广播不会离开我们的程序, 因此不需要担心机密数据泄漏的问题。
- 其他的程序无法将广播发送到我们程序的内部, 因此不需要担心会有安全漏洞的隐患。
- 发送本地广播比起发送系统全局广播将会更加高效。
5.广播的生命周期
广播接收者的生命周期是非常短暂的,在接收到广播的时候创建,onReceive()方法结束之后销毁
广播接收者中不要做一些耗时的工作,否则会弹出Application No Response错误对话框
最好也不要在广播接收者中创建子线程做耗时的工作,因为广播接收者被销毁后进程就成为了空进程,很容易被系统杀掉
耗时的较长的工作最好放在服务中完成
- android学习笔记之四:四大组件之BroadcastReceiver
- Android 四大组件学习之BroadcastReceiver四
- Android学习笔记--四大组件之BroadcastReceiver
- Android学习笔记四大组件之BroadcastReceiver
- Android学习之四大组件(四)——BroadcastReceiver
- Android学习笔记 day07 _ Android四大组件之BroadcastReceiver
- Android 四大组件学习之BroadcastReceiver一
- Android 四大组件学习之BroadcastReceiver二
- Android 四大组件学习之BroadcastReceiver三
- Android 四大组件学习之 BroadcastReceiver
- Android学习之路--四大组件--BroadCastReceiver
- Android四大组件学习之BroadcastReceiver
- android四大组件之BroadCastReceiver
- android 四大组件之 broadcastreceiver
- android四大组件之BroadcastReceiver
- Android四大组件之BroadcastReceiver
- Android四大组件之BroadcastReceiver
- Android四大组件之BroadcastReceiver
- vim 多窗口编辑
- 课程学习方法体系
- functions setting in R
- DataGridView的VirtualMode,在大容量数据加载时特别有用
- CSS margin 属性
- android学习笔记之四:四大组件之BroadcastReceiver
- CodeForces 550C Divisibility by Eight 简单题算是找规律?
- 顺序表的删除操作
- Ubuntu 16安装vmware tools
- 双机调度问题
- [LeetCode] Add Two Numbers
- 第九周项目2- 对称矩阵压缩存储的实现与应用(1)
- 【机器学习笔记1】Logistic回归总结
- 排序八 基数排序