对BroadcastReceiver 的简单理解

我接触到的BroadcastReceiver分为两种:
1.BroadcastReceiver 是单独一个类 继承 BroadcastReceiver,实现onReceiver方法。但这个类需要注册到系统,即需要在AndroidManifest.xml中声明。
intent-filter用以说明:何种类型的广播能激活该receiver
而“android.permission.RECEIVE_BOOT_COMPLETED”一般用于自启动程序的声明,当android系统启动时会发送该广播,所以自启动程序必需声明android.permission.RECEIVE_BOOT_COMPLETED

<receiver android:name=".BootReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"></action>
</intent-filter>
</receiver>

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

BootReceiver类的作用:android系统启动后,启动一个service服务。
public class BootReceiver extends BroadcastReceiver{

@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub

Log.d("BootReceiver", "aaaaaaaaaaaa");
if(intent.getAction().equals("android.intent.action.BOOT_COMPLETED")){
Intent newIntent = new Intent(context,UpdateService.class);
newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startService(newIntent);
}

Log.d("BootReceiver", "onReceived");
}


}

2. 第二中 BroadcastReceier,写成一个类的内部类,这样就不需要 注册到系统,
内部类:
class TimelineReceiver extends BroadcastReceiver{

@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
//cursor.requery();
//adapter.notifyDataSetChanged();
setupList();

Log.d(TAG, "onReceived.");
}

}

在onCreate()方法里进行初始化,当然 receiver(TimelineReceiver)与 filter(IntentFilter)定义为全局变量 .
这里的filter的解释:为指定何种事件将激活receiver.我们需要实例化一个IntentFilter,此实例用于表明需要被告知的intent action.这里使用一条action事件的字符串来初始化它。

receiver = new TimelineReceiver();
filter = new IntentFilter("com.example.NEW_STATUS");

在 onResume()方法中, 注册receiver对象
registerReceiver(receiver,filter);

在 onPause()方法中,取消receiver对象的注册

unregisterReceiver(receiver);


最后是广播的Intent
最后,为触发该过滤器(filter)所对应的事件,我们需要广播一条能够匹配当前intent过滤器正在监听的intent.在前面的BootReceiver例子中,我们不需要广播,是因为系统会广播相应的intent.但对TimelineReceiver来说,它接收的广播需要我们自己来创建。

我们发送广播的地方是:在一个服务(用于连接在线服务并抓取数据),当有新的数据时,发送通知。


private class Updater extends Thread{

public Updater() {
super("UpdateService--Updater");
// TODO Auto-generated constructor stub
}

@Override
public void run() {
// TODO Auto-generated method stub
UpdateService updateService = UpdateService.this;
while(updateService.runFlag){
Log.d(TAG, "Updater ruuning.");
try {

YambaApplication yamba = (YambaApplication) updateService.getApplication();
int newUpdates = yamba.fetchStatusUpdates();
Log.d(TAG, "newUpdates is size :" + newUpdates);
if(newUpdates > 0){
Log.d(TAG, "We hava a new status.");

//当有 新的好友信息时,发送广播,这个action和之前IntentFilter里定义的一致
intent = new Intent("com.example.NEW_STATUS");
intent.putExtra(1, newUpdates);

updateService.sendBroadcast(intent);

}

Log.d(TAG, "Updater RAN.");
Thread.sleep(DELAY);

} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
updateService.runFlag = false;
}

}
}

}


这里边涉及一个 添加用于发送、接收广播的自定义权限 问题,下篇详解。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值