本文目录
- android broadcastreceiver需要注销吗
- BroadcastReceiver详解(基础篇)
- 如何理解Android BroadcastReceiver 方法onReceive的参数intent
- Android2.1 BroadCastReceiver接收不到数据,什么原因
- 如何注册broadcastreceiver
android broadcastreceiver需要注销吗
需要,否则的话可能会产生内存泄露。
必须要,不然会报错,这是android的广播机制
BroadcastReceiver是一个用于监听应用程序运行环境变化,并且对变化事件作出响应的组件。譬如说,当电池电量低、SD卡拔插或者手机启动完毕等等事件发生的时候,系统都会广播相应的事件,那么,我们在应用程序中就可以利用BroadcastReceiver对这些事件进行监听,并且执行onReceive方法作出相应的处理。 我们可以通过两种方式注册BroadcastReceiver,一是在Activity启动过程中通过代码动态注册,二是在AndroidManifest.xml文件中利用《receiver》标签进行静态注册。对于第一种方法,我们需要养成一个良好的习惯:在Activity进入停止或者销毁状态的时候使用unregisterReceiver方法将注册的BroadcastReceiver注销掉。基于此,我们很自然就会想,如果通过第二种方法注册的BroadcastReceiver,是否需要通过代码进行注销呢?基于这个问题,Michael在OPhoneSDN上提出这个疑问。 最后,Michael还是从Android的源代码中找到了这样的注释:If this BroadcastReceiver was launched through a 《receiver》 tag, then the object is no longer alive after returning from this function. This means you should not perform any operations that return a result to you asynchronously. 这段文字告诉我们:如果通过《receiver》标签来注册的BroadcastReceiver,那么该对象的实例在onReceive被调用之后就会在任意时间内被销毁。也就是说,我们并需要担心静态注册的BroadcastReceiver的销毁问题。
BroadcastReceiver详解(基础篇)
Broadcast (广播)是一种广泛运用的应用程序之间传输信息的机制,而 BroadcastReceiver (广播接收器)则是用于接收来自系统和应用的广播对并对其进行响应的组件,Android中我们要发送的广播内容是一个 Intent ,这个 Intent 中可以携带我们要传送的数据
创建一个广播接收器非常简单,只需要继承 BroadcastReceiver ,并重写 onReceive() 即可
BroadcastReceiver 也是四大组件之一,所以我们也需要对 BroadcastReceiver 进行注册,不同于其他四大组件, BroadcastReceiver 有两种注册方式,分别是 静态注册 和 动态注册
静态注册
当我们的应用首次启动的时候,系统会自动实例化我们静态注册的 BroadcastReceiver ,然后将这个 BroadcastReceiver 注册到系统中,系统接收到广播之后,就会做出相应的判断,调用 onReceive() 方法。通过这种方式注册的广播,即使我们的应用被销毁,依然能收到广播。 这里要注意的是,我们的应用一定要被启动过 ,如果没有被启动可能就无法接收到广播,可以参考文章 Android应用在未启动的情况下无法收到指定广播的问题总结
正是因为静态注册耗电、占内存、不受程序生命周期影响,所以Google在Android 8.0上禁止大部分广播的静态注册,可以参考官文文档 Android 8.0 功能和 API
动态注册
通过动态注册的广播, BroadcastReceiver 的生命周期跟随Activity的生命周期
注意: 要在 Activity 的 onPause() 中 unRegeisterReceiver() ,否则会引起内存泄漏。比较推荐 onResume() 中去注册广播,在 onPause() 中去注销广播。因为在内存资源比较吃紧的情况下,可能我们的 Activity 执行完 onPause() 之后就被销毁,这时候 Activity 的 onStop() 和 onDestory() 方法就不会执行了
BroadcastReceiver注册完之后,这个 BroadcastReceiver 就能够接收响应的广播,下面我们来说说如何发送一条广播
普通广播(Normal Broadcast)
普通广播完全是异步的,通过 context.sendBroadcast() 方法发送,消息传递效率比较高,但所有接收器的执行顺序不确定。缺点是接收者不能将处理结果传递给下一个接收者,并且无法终止广播的传播
有序广播(Ordered Broadcast)
有序广播是通过 context.sendOrderedBroadcast() 方法发送,所有的广播者按照优先级依次执行,广播接收器的优先级通过 receiver 的 intent-filter 中的 android:priority 属性来设置,数值越大优先级越高。当广播接收器接收到广播后,可以使用 setResult() 方法把结果传递给下一个接收者,通过 getResult() 方法获取上一个接收者传递过来的结果,并可以通过 abortBroadcast() 方法丢弃该广播,使该广播不再传递给下一个接收者
粘性广播(Sticky Broadcast)
粘性广播通过 context.sendStickBroadcast() 方法来发送,用此方法发送的广播会一直滞留,当有匹配此广播的接收器被注册后,该广播接收器就会收到此广播。使用此广播时,需要获得 BROADCAST_STICKY 权限
由于在Android5.0 & API 21中已经失效,所以不建议使用。
本地广播(Local Broadcast)
前三种广播都是全局广播,所有应用都可以接收到,这样就带来安全隐患,而本地广播只在进程内传播,可以起到保护数据安全的作用
其实,本地广播的使用与其十分类似,之前的步骤均是一样的,调用者不同而已,本地广播调用的是 LocalBroadcastManager 相关方法,全局广播调用的是 Context 的相关方法,其方法名都是一样的
这里需要说一下, 使用本地广播并没有静态注册的方法 ,因为静态注册主要是为了让程序在未启动的情况下也能收到广播,而发动本地广播的时候,我们的程序已经是启动了,所以,自然是没有静态注册这个方法
Android中内置了多个系统广播,当使用系统广播时,只需要在注册广播接收者时定义相关的 action 即可,并不需要手动发送广播,当系统有相关操作(如开机、网络状态变化、拍照等等)时会自动进行系统广播
Android系统广播 action 如下:
本文介绍了 BroadcastReceiver 的两种注册方式(动态注册、静态注册),四种发送方式(普通广播、有序广播、粘性广播(API21废弃)、本地广播),以及系统广播的用法。几乎涵盖了 BoradcastReceiver 在应用开发过程中的所有知识,对于BroadcastReceiver原理感兴趣的可以继续看 BroadcastReceiver详解(原理篇)
如何理解Android BroadcastReceiver 方法onReceive的参数intent
onReceive(...)是BroadcastReceiver的方法,当系统接收到intent broadcast时,就会被调用到。intent可以来自于sendBroadcast(Intent intent, String receiverPermission),比如,你有一个service,你需要在某些情况下向前台发送消息,就可以调用这个API,通过intent.put...可以附加很多参数。App实现一个BroadcastReceiver来接收intent,取出参数进一步处理,这是情景之一;intent也可以来自于系统广播,比如你希望获得地理位置的更新,通常需要编写下述代码,LocationManager在将来某个时点帮忙发送某种类型的Intent,然后你就可以从intent中拿到地理位置数据了,这也是情景之一:mLocationManager.requestLocationUpdates(provider, 0, 0, PendingIntent pi);public class LocationReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // 获取包含地理位置信息的intent Location loc = (Location) intent.getParcelableExtra(LocationManager.KEY_LOCATION_CHANGED); ...... }}
Android2.1 BroadCastReceiver接收不到数据,什么原因
Android2.1 BroadCastReceiver接收不到数据的原因是因为不支持某些文件类型。具体解决方式为: 1.蓝牙默认支持所有图片,所有视频,所有音频,文本类型,html,zip,excel,word,ppt,pdf等类型。2.使用RE文件夹,找到package/app/bluetooth,对其目录下的AndroidManifest.xml文件的《data android:mimeType="" /》,添加相应的类型即可。3.具体的添加内容为《receiver android:name=".GetData"》 《intent-filter》 《action android:name="android.provider.Telephony.SMS_RECEIVED" /》 《/intent-filter》 《/receiver》 这一段写到application标记里面。
如何注册broadcastreceiver
静态注册(在 AndroidManifest.xml 中 ) view plaincopy 《receiver android:name=".BroadcastReceiverDemo" 》 《intent-filter》 《action android:name="com.simware.BroadcastReceiverDemo" 》 《/action》 《/intent-filter》 《/receiver》 创建一个BroadcastReceiver view plaincopy public class BroadcastReceiverDemo extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub String msg = intent.getStringExtra("message"); Toast.makeText(context, msg, Toast.LENGTH_LONG).show(); } }在onReceive方法内,可以获取随广播而来的Intent中的数据,这非常重要,就像无线电一样,包含很多有用的信息。在创建完我们的BroadcastReceiver之后,还不能够使它进入工作状态,我们需要为它注册一个指定的广播地址。没有注册广播地址的BroadcastReceiver就像一个缺少选台按钮的收音机,虽然功能俱备,但也无法收到电台的信号。在Manifest.xml文件中已经注册了BroadcastReceiver的广播地址。 《span style="font-size: 18px;"》 《/span》《span style="font-size:18px;"》Intent mIntent = new Intent("com.simware.BroadcastReceiverDemo"); mIntent.putExtra("message", showText.getText().toString()); sendBroadcast(mIntent);《/span》