安卓四大核心组件之广播接收者

来源:互联网 发布:藏宝阁交易数据异常 编辑:程序博客网 时间:2024/05/01 14:16

Android有四大核心组件:Activity,Service,BroadcastReceiver,ContentProvider,这四大组件在Android开发过程是每天几乎都会用到,所以我觉得有必要对这四大组件详细说明一下,本文中我会介绍一下什么是BroadcastReceiver,注册BroadReceiver的两种方式以及两种注册方式的优缺点,我们平常常用的一些广播以及接收这些广播会用到的权限,在文章的最后会探讨一下有序广播和无序广播,另外我在以后的文章中也会写关于其他三大组件的。

 

1.BroadcastReceiver简介

 

         在Android中,Broadcast是一种广泛运用的在应用程序之间传输信息的机制。而BroadcastReceiver是对发送出来的Broadcast进行过滤接受并响应的一类组件。广播接收者(BroadcastReceiver)用于接收广播Intent的, 广播Intent的发送是通过调用sendBroadcast/sendOrderedBroadcast来实现的。通常一个广播Intent可以被订阅了此Intent的多个广播接收者所接收。

 

2.BoradcastReceiver的注册

 

      1)静态注册:在AndroidManifest.xml中注册广播

 

              AndroidManifest.xml中的<application>节点下添加<receiver>节点,通过配置android:name指定广播接收者的类,并且在<receiver>节点下添加<intent-filter>节点,

 

      然后在更下级添加<action>节点,通过配置<action>节点的androidname属性指定该广播接收者可以接收的广播,

 

      2)动态注册:在Java代码中注册

 

             1)调用ContextWrapper类定义的registReceiver(BroadcastReceiverreceiver,IntentFilter filter)方法注册

 

            2)自行创建receiver对象

 

            3)初始化filter对象,并调用filter.addCatergory(Intent.CATEGORY.DEFAULT);并且通过filter.addAction(Stringaction)添加该广播接受者可以接受的广播

 

      下面说一下两种注册的优缺点以及注意事项:

 

              *)java代码注册的广播接收者优先级要比清单文件的要高, 但是当前的广播接收者的生命周期的期限和activity是相关联的,activity销毁,广播接收者也就不再起作用。


             *)通过清单文件注册的广播接收者在系统中运行一次后就会被注册到系统中,以后无需运行此广播接受者,但是也可以接收到广播。
             *)接收广播时要注意在清单文件中添加对应的权限。
3.常用广播及所需权限
      1.接听拨打电话的广播
                拦截的广播:<action android:name="android.intent.action.NEW_OUTGOING_CALL"></action>
                需要的权限:<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
     2.监听系统开机的广播     

                 拦截的广播:<action android:name="android.intent.action.BOOT_COMPLETED"></action>                                                                      需要的权限:<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
     3.监听安装和卸载程序的广播   

                拦截的广播:<action android:name="android.intent.action.PACKAGE_ADDED"></action>
                                         <action android:name="android.intent.action.PACKAGE_REMOVED"></action>
    4.拦截短信的广播
               拦截的广播:<action android:name="android.provider.Telephony.SMS_RECEIVED"></action>
               需要的权限: <uses-permission android:name="android.permission.RECEIVE_SMS"/
4.自定义广播
    1.无序广播:
             *)无序广播不可以被拦截,如果被拦截的话会报错:BroadcastReceiver trying to return result during a non-orderedbroadcast
             *)所有接收无序广播的广播接收者在此广播被发送时均能接收到此广播
             *)无序广播使用sendBroadcast方法来发送
    2.有序广播:
             *)设置有序广播可以使用:sendOrderedBroadcast(intent, receiverPermission, resultReceiver, scheduler, initialCode, initialData, initialExtras)
                  第一个参数 Intent类型:意图
                  第二个参数 String类型 receiverPermission,接收器需要的权限
                  第三个参数BroadcastReceiver类型,自己定义的接收器作为最终接收器
                  第四个参数Handler类型,用于执行接收器的回调,如果为null则在主线程中执行
                  第五个参数int类型,结果代码的初始码
                  第六个参数初始化参数
                  第七个参数Bundle类型,额外的数据
             *) 有序广播可以被拦截,且优先级高的接收者可以拦截优先级低的        
             *)  广播接收者的优先级的取值范围是: 1000(最高) ~ -1000(最低)
             *) 相同优先级下,接收的顺序要看在清单文件中声明的顺序,先声明的接收者比后声明的要先收到广播
             *)无序广播使用sendOrderedBroadcast方法来发送,使用abortBroadcast方法拦截
             *)广播接收者的优先级在清单文件中声明接收者时,在<intent-filter>标签下通过设置”android:property”属性来设置
    注意:
       BoradcastReceiver的作用主要是监听系统或者应用发出的广播信息,然后根据接收的的广播信息进行相应的处理。实现广播接收者仅需要重写一个onReceiver()方法,如果广播接收者接收到相应的广播之后则会执行这个方法。我们需要注意的是,不要在onReceiver()中进行耗时的操作,当onReceiver()中的操作10s内没有执行完之后,系统将会报错,当我们需要进行耗时的操作时,可以通过intent调用activity和service进行处理。

0 0
原创粉丝点击