在API文档中关于BroadcastReceiver的概述:
广播接收器是一个专注于接收广播通知信息,并做出对应处理的组件。很多广播是源自于系统代码的──
比如,通知时区改变、电池电量低、拍摄了一张照片或者用户改变了语言选项。应用程序也可以进行广播
──
比如说,通知其它应用程序一些数据下载完成并处于可用状态。
应用程序可以拥有任意数量的广播接收器以对所有它感兴趣的通知信息予以响应。所有的接收器均继承自BroadcastReceiver
基类。
广播接收器没有用户界面。然而,它们可以启动一个activity
来响应它们收到的信息,或者用
NotificationManager
来通知用户。通知可以用很多种方式来吸引用户的注意力
──
闪动背灯、震动、播放声音等等。一般来说是在状态栏上放一个持久的图标,用户可以打开它并获取消息。
那么广播事件的流程如何呢,如下:
注册广播事件:注册方式有两种,一种是静态注册,就是在AndroidManifest.xml
文件中定义,注册的广播接收器必须要继承
BroadcastReceiver
;另一种是动态注册,是在程序中使用
Context.registerReceiver
注册,注册的广播接收器相当于一个匿名类。两种方式都需要
IntentFIlter
。
发送广播事件:通过Context.sendBroadcast
来发送,由
Intent
来传递注册时用到的
Action
。
接收广播事件:当发送的广播被接收器监听到后,会调用它的onReceive()
方法,并将包含消息的
Intent
对象传给它。
onReceive
中代码的执行时间不要超过
10s
,否则
Android
会弹出超时
dialog
。
具体做法:
在发送广播之前,我们还是需要先定义一个广播接收器来准备接收此广播才行,不然发
出去也是白发。因此新建一个MyBroadcastReceiver
继承自
BroadcastReceiver
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "
接收到广播消息
", Toast.LENGTH_SHORT).show(); }
}
这里当 MyBroadcastReceiver
收到自定义的广播时,就会弹出提示语。然后在
AndroidManifest.xml
中对这个广播接收器进行注册:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.broadcasttest"
android:versionCode="1"
android:versionName="1.0" >
……
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<receiver android:name=".MyBroadcastReceiver" >
<intent-filter>
<action android:name="com.example.broadcasttest.MY_BROADCAST" />
</intent-filter>
</receiver>
</application>
</manifest>
可以看到,这里让 MyBroadcastReceiver
接收一条值为
com.example.broadcasttest. MY_BROADCAST
的广播,因此待会儿在发送广播的时候,我们就需要发出这样的一条广播。
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
sendBroadcast(intent);
}
});
}
}
可以看到,我们在按钮的点击事件里面加入了发送自定义广播的逻辑。首先构建出了一
个 Intent
对象,并把要发送的广播的值传入,然后调用了
Context
的
sendBroadcast()
方法将广 播发送出去,这样所有监听
com.example.broadcasttest.MY_BROADCAST
这条广播的广播接 收器就会收到消息。此时发出去的广播就是一条标准广播。
文章来自:博客园/cryAllen