灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:1843回复:0

android之BroadcastReceiver的使用

楼主#
更多 发布于:2012-09-06 13:48


BroadcastReceiver用于接收广播Intent,广播Intent的发送是通过调用Context.sendBroadcast()、Context.sendOrderedBroadcast()来实现的。通常一个广播Intent可以被订阅了此Intent的多个广播接收者所接收
0.要实现一个广播接收者方法如下:
(1)第一步:继承BroadcastReceiver,并重写onReceive()方法。

public class IncomingSMSReceiver extends BroadcastReceiver
{
  @Override public void onReceive(Context context, Intent intent){ }
}

(2)第二步:订阅感兴趣的广播Intent,订阅方法有两种:
第一种:使用代码进行订阅

IntentFilter filter = new IntentFilter("Android.provider.Telephony.SMS_RECEIVED");
IncomingSMSReceiver receiver = new IncomingSMSReceiver();
registerReceiver(receiver, filter);

第二种:在AndroidManifest.xml文件中的<application>节点里进行订阅:

<receiver Android:name=".IncomingSMSReceiver">
    <intent-filter>
         <action Android:name="Android.provider.Telephony.SMS_RECEIVED"/>
    </intent-filter>
</receiver>



1.除了短信到来广播Intent,Android还有很多广播Intent,如:开机启动、电池电量变化、时间已经改变等广播Intent。

(1)接收电池电量变化广播Intent ,在AndroidManifest.xml文件中的<application>节点里订阅此Intent:
<receiver Android:name=".IncomingSMSReceiver">
    <intent-filter>
         <action Android:name="Android.intent.action.BATTERY_CHANGED"/>
    </intent-filter>
</receiver>


(2)接收开机启动广播Intent,在AndroidManifest.xml文件中的<application>节点里订阅此Intent:
<receiver Android:name=".IncomingSMSReceiver">
    <intent-filter>
         <action Android:name="Android.intent.action.BOOT_COMPLETED"/>
    </intent-filter>
</receiver>

并且要进行权限声明:

<uses-permission Android:name="Android.permission.RECEIVE_BOOT_COMPLETED"/>

2.在Android中,程序的响应(Responsive)被活动管理器(Activity Manager)和窗口管理器(Window Manager)这两个系统服务所监视。当BroadcastReceiver在10秒内没有执行完毕,Android会认为该程序无响应。所以在BroadcastReceiver里不能做一些比较耗时的操作,否侧会弹出ANR(Application No Response)的对话框。如果需要完成一项比较耗时的工作,应该通过发送Intent给Service,由Service来完成。而不是使用子线程的方法来解决,因为BroadcastReceiver的生命周期很短(在onReceive() 执行后BroadcastReceiver 的实例就会被销毁),子线程可能还没有结束它就先结束了。当然如果BroadcastReceiver结束了,它的宿主进程还在运行,子线程还会继续执行。但宿主进程此时很容易在系统需要内存时被优先杀死,因为它属于空进程(没有任何活动组件的进程)。

public class IncomingSMSReceiver extends BroadcastReceiver {
  @Override public void onReceive(Context context, Intent intent) {
            //发送Intent启动服务,由服务来完成比较耗时的操作
            Intent service = new Intent(context, XxxService.class);
            context.startService(service);
  }
}


每次广播消息到来时都会创建BroadcastReceiver实例并执行onReceive() 方法。


喜欢0 评分0
游客

返回顶部