Developer-BroadcastReceiver

来源:互联网 发布:同服务器域名查询 编辑:程序博客网 时间:2024/06/05 17:22

一、综述

该类主要用于接收 sendBroadcast() 的intents。这里需要注意一下,最好是用LocalBroadcastManager而不是更加普遍的方法。

注册使用方式:

Context.registerReceiver() 或者在Manifest文件里面注册

注意:如果你注册了receiver在Activity.onResume()里面,需要解除注册在Activity.onPause()。不能够在Activity.onSaveInstanceState()解除注册,因为有可能不会调用、

broadcastreceiver可以接受的两大类的broadcast类:

1)Normalbroadcasts( Context.sendBroadcast 发出) 异步。所有的receiver不是以特定顺序运行的,因此不能使用结果或者中止API

2)Ordered broadcasts(Context.sendOrderedBroadcast发出)每次只能发送给一个receiver.多个的话,轮流执行,能够把结果传递给下一个receiver,当然也可以就此中止。receiver运行的顺序被android:priority(intent-filter)控制,没设定时就随便。

注意:intent broadcast机制与intent activity完全分开,一个后台,一个可以为用户显示。

1、安全性问题

因为receiver是 cross-application的,有可能被其他的应用滥用。如何降低概率呢?:

1)关于Intent的命名空间定为global

2)如果是以registerReceiver(BroadcastReceiver,IntentFilter)的方式,或者是manifest的方式,即使设定了intent-filter 任何应用都可以为该receiver发送广播,可以通过permission来限定: android:exported="false"

3)如果用sendBroadcast(Intent)或相关方法,其他的应用会接收到这些广播。限定方法:用Intent.setPackage

但是如果用localBroadcastManager的话,不存在以上问题。

为了设定这些permission,可以采用sendBroadcast(Intent, String) orsendOrderedBroadcast(Intent, String, BroadcastReceiver, android.os.Handler, int, String, Bundle).只有设置了<uses-permission>的才可以接收。

为了限定谁可以发送,需要设定registerReceiver(BroadcastReceiver, IntentFilter, String, android.os.Handler) or in the static <receiver> tag in your AndroidManifest.xml.

2、Receiver的生命周期

BroadcastReceiver对象只有在调用 onReceiver(Context,Intent)时有效,一旦返回了,则生命周期结束。

onReceive(Context, Intent)里可以做哪些事情:

1)不能处理异步事件,因为需要返回。

2)不要显示dialog 要用NotificationManager

3)在receiver里面绑定一个服务,这个时候可以用Context.startService()发送给service的命令


二、重要方法

1、 goAsync()

在onReceive(Context,Intent)里面调用,在从函数返回后也能允许保持广播活跃

2、abstract void onReceive(Context context, Intent intent)

参数:context:receiver运行的context  intent:正在接收的intent

BroadcastReceiver 正在接收广播时调用,在这个期间,你可以查看或者修改当前的结果值(比如setResultData等)。一般是在主线程里运行,如果新开一个线程运行的话,需要 registerReceiver(BroadcastReceiver, IntentFilter, String, android.os.Handler). 注意,在主线程里运行的时候永远不要耗时的。

如果receiver是通过<receiver> 加载的,返回之后就不能保持存活了。应该用startservice(Intent)而不是bindService(Intent, ServiceConnection,int)如果是与已经在运行的service交互,用peekService(Context context)。

注意:为了安全,onReceive()里面应该只对已知的action作出回应,忽略未定义的Intent。


补充的细节问题:http://www.cnblogs.com/renyuan/archive/2012/06/18/2553941.html

4.BroadcastReceiver的生命周期
每次接收广播信息完毕后,当前的BroadcastReceiver
就会被回收,当下次再广播时将再次创建新的对象
步骤:
*1)android操作系统产生一个事件,就会通知已经
注册到操作系统的BroadcastReceiver
2)BroadcastReceiver自己判断是否自己需要的事件
比如直接拦截黑名单电话号码
*其核心方法是onReceive(),需要处理的代码都放在这个方法中
在AndroidManifest.xml中需要配置:
<receiver android:name=".BroadcastReceiveActivity">
/**下面的<intent-filter>是设置对何种情况下接收广播机制*/
<intent-filter>
<action android:name="android.intent.action.EDIT"/>
</intent-filter>
</receiver>
*it.setAction(Intent.ACTION_EDIT);中设置的操作必须和主配置文件
中的一致才会广播信息
5.注册BroadcastReceiver的方法
注册方法有两种:
1)在应用程序中代码当中进行注册
特点:程序关闭后,就收不到广播信息
两个重要的方法:
/**注册BroadcastReceiver*/
a.registerReceiver(receiver,filter);
/**取消注册BroadcastReceiver*/
b.unregisterReceiver(receiver);
2)在AndroidManifest.xml当中进行注册
特点:无论应用程序关闭与否,都回收到广播消息
6.Android内置的BroadcastActions


三、可以实现的例子

http://www.cnblogs.com/playing/archive/2011/03/23/1992030.html


0 0
原创粉丝点击