android BroadcastReceiver 使用小结
来源:互联网 发布:java 上传大文件 编辑:程序博客网 时间:2024/05/29 13:09
BroadcastReceiver 作为android4大组件之一,使用的很普遍,下面是对使用BroadcastReceiver一些总结。
1. android 广播机制的三要素:
广播(Broadcast) - 用于发送广播;
广播接收器(BroadcastReceiver) - 用于接收广播;
意图内容(Intent)-用于保存广播相关信息的媒介。
Broadcast是一种广泛运用的在应用程序之间传输信息的机制。
而BroadcastReceiver是对发送出来的Broadcast进行过滤接受并响应的一类组件。
2.BroadcastReceiver的注册
BroadcastReceiver的注册有两种方式,静态注册和动态注册。
2.1静态注册
静态注册通过在
AndroidManifest.xml文件中进行注册。
<receiver <span style="white-space:pre"></span>android:name="com.example.testbroadcastreceiver.TestBroadcastReceiver" android:enabled="true"android:exported="false"android:process=":test"><intent-filter><action android:name="android.intent.action.EDIT" /></intent-filter></receiver>
涉及的属性包括:
android:name:broadcastReceiver的类名。
android:exported:决定此broadcastReceiver能否接收其他应用发送的广播,该属性默认值由receiver是否设置<intent-filter>有关,当设置了<intent-filter>时,该属性的默认值为true,否则为false。
android:permission:设置广播发送方的权限,具备相应权限的发送方发送的广播可以被该receiver接收。
android:process:设置receiver运行时所处的进程的名称。设置服务所在进程名称是由用户决定的,当进程名以冒号":"开始时表示该进程是应用的私有进程,这时候会把进程名附加到包名后面形成新的进程名。当进程名是以小写字母开头时,则表示这个服务将运行在一个以这个名字命名的全局的进程中,但前提是该进程必须具备相应的权限。
<intent-filter>用于指定此广播接收器将用于接收特定的广播类型。
2.2动态注册
BroadcastReceiver的动态注册通过在代码中调用registerReceiver函数,必须在合适的地方调用unregisterReceiver()注销注动态注册的BroadcastReceiver,例如在Activity的onDestroy函数里注销广播。
动态注册的代码:
it = new Intent(Intent.ACTION_EDIT);it.putExtra("msg", "boardreceiver test");IntentFilter filter = new IntentFilter(Intent.ACTION_EDIT);MainActivity.this.receiver = new TestBroadcastReceiver();MainActivity.this.registerReceiver(receiver, filter);
BroadcastReceiver注销:
@Overridepublic void onDestroy(){super.unregisterReceiver(receiver);super.onStop();}
3. BroadcastReceiver使用方法
3.1定义BroadcastReceiver
自定义BroadcastReceiver,重写onReceive()方法,当接收到广播时,会回调此方法,在此做需要处理的工作。代码例子如下:
class TestBroadcastReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {// TODO Auto-generated method stubSystem.out.println("onReceiver Boardcast test2");if("android.intent.action.EDIT".equals(intent.getAction())){test.setText("已经接收广播");String msg = intent.getStringExtra("msg");System.out.println("msg" + msg);Toast.makeText(context, "TestBroadcastReceiver2", Toast.LENGTH_SHORT).show();}}}
3.2注册BroadcastReceiver,可以通过静态和动态注册广播。
静态注册直接在AndroidManifest.xml里面注册:
<receiver android:name="com.example.testbroadcastreceiver.TestBroadcastReceiver" android:enabled="true"android:exported="false"android:process=":test"><intent-filter><action android:name="android.intent.action.EDIT" /></intent-filter></receiver>动态注册:
IntentFilter filter = new IntentFilter(Intent.ACTION_EDIT);MainActivity.this.receiver = new TestBroadcastReceiver();MainActivity.this.registerReceiver(receiver, filter);3.3发送广播
调用Context的sendBroadcast()进行发送广播
Intent it = new Intent(Intent.ACTION_EDIT);it.putExtra("msg", "boardreceiver test2222");MainActivity.this.sendBroadcast(it);
3.4接收广播
广播接收完成后将会回调onReceive()方法,在此方法执行需要的操作。需要注意的是,BroadcastReceiver是运行在UI主线程的,所以不能在此做过多耗时的操作。
4. 注意问题
1. 一个广播使用了静态注册和动态注册,则会注册两次广播接收者。
2. 当发送广播被不想被除应用第三方接收时,应该给broadcast发送方设置permission权限。
3. 当自己广播接收器需要过滤特定广播来源时,需要给广播接收器设置intent-filter指定接收广播的类型。
4. onReceive()方法运行在主线程,不能做耗时的操作,否则会导致主线程阻塞,需要处理耗时操作时可以通过启动一个service进行处理。
5. 自定义BroadcastReceiver作为Activity的内部类时,需要使用动态注册的方式,否则会报java.lang.InstantiationException: no empty constructor异常。
6. 当接收到广播时,会重新创建BroadcastReceiver对象,回调onReceive()函数,之后BroadcastReceiver对象将被销毁。
- android BroadcastReceiver 使用小结
- [Android] BroadCastReceiver的使用
- Android中BroadCastReceiver使用
- Android中BroadCastReceiver使用
- Android BroadcastReceiver 使用 SQLite
- Android中BroadCastReceiver使用
- Android中BroadCastReceiver使用
- Android中BroadCastReceiver使用
- Android -- BroadcastReceiver的使用
- Android中BroadCastReceiver使用
- Android BroadcastReceiver的使用
- Android~Service+BroadcastReceiver使用
- Android-BroadcastReceiver使用笔记
- Android BroadcastReceiver使用详解
- Android BroadcastReceiver使用详解
- 【android】BroadcastReceiver的使用
- Android中BroadCastReceiver使用
- Android BroadcastReceiver使用
- Java - 贪心算法 - 最大子阵列
- jquery悬停图片展示大图
- LCA(Least Common Ancestors)最近公共祖先
- Flex布局新旧混合写法详解(兼容微信)
- java并发
- android BroadcastReceiver 使用小结
- 获取当前屏幕的宽高
- WdatePicker 时间插件
- 如何在 iOS 上避免 SIGPIPE 信号导致的 crash (Avoiding SIGPIPE signal crash in iOS)
- Java程序员必须掌握的排序算法Java实现整合二 :选择排序
- C#多线程学习 之 线程池[ThreadPool]
- phpexcel读写excel表格详解
- ActiveMQ 简介
- 算法系列-----剑指offer