×

broadcastreceiver android oa

broadcastreceiver(android broadcastreceiver需要注销吗)

admin admin 发表于2023-07-08 17:13:29 浏览50 评论0

抢沙发发表评论

本文目录

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》