我接触到的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;
}
}
}
}
这里边涉及一个 添加用于发送、接收广播的自定义权限 问题,下篇详解。
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;
}
}
}
}
这里边涉及一个 添加用于发送、接收广播的自定义权限 问题,下篇详解。