BroadcastReceiver是Android中的广播接收者,既然有接收,自然就有发送,首先看如下发送程序:
Intent broadInt = new Intent("myChannel");
broadInt.putExtra("message", "我发送了一则通知!");
sendBroadcast(broadInt);
这段代码写在Activity中即可,例如绑定在按钮的点击事件上。
代码包括三行, 第一行是创建一个Intent,并且为该Intent指定Action,Action随意命名即可,当然,不要跟系统中的其他Action冲突。
第二行为该Intent设置捆绑信息,通过此种手段,可以在发送该Intent的同时,把一些信息同时发送出去。
第三行则是发送消息的关键,sendBroadcast方法是Activity的方法,在任一Activity中均可调用,参数为方才定义的Intent。
广播发送后,即可来实现接收程序,我知道的接收程序有两种写法。
第一种是继承android.content.BroadcastReceiver,并实现其onReceive方法:
/**
*
* Dec 22, 2014 7:02:20 PM
* @Geloin
*
*/
package com.geloin.baseopera.receiver;
import android.app.AlertDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
/**
*
* Dec 22, 2014 7:02:20 PM
*
* @Geloin
*
*/
public class BookReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals("myChannel")) {
String message = intent.getStringExtra("message");
Toast.makeText(context, message, Toast.LENGTH_LONG).show();
} else if (action.equals("SyncService")) {
String message = intent.getStringExtra("message");
new AlertDialog.Builder(context).setTitle("提示").setMessage(message)
.setPositiveButton("确定", null).show();
}
}
}
实现代码较为简单,实现onReceive方法,在其内部根据不同的action获取不同的Extra信息,并进行处理即可,当然,没有Extra时做其他处理也是一样的。
还未结束,自定义的Receiver需要在AndroidManifest.xml中进行注册,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.geloin.baseopera"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="17"
android:targetSdkVersion="21" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".activity.BooksActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<span style="color:#ff0000;"><provider
android:name=".provider.BookProvider"
android:authorities="com.geloin.baseopera.provider.BookProvider"
android:exported="false" >
</provider></span>
</application>
</manifest>
provider即为注册代码。
到这一步,广播的发送及接收过程则已完成。
第二种BroadcastReceiver则不继承android.content.BroadcastReceiver,而是直接使用它。
发送代码与上述一致,不需要修改。
接收代码可写在同一Activity中:
IntentFilter filter = new IntentFilter("myChannel");
registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String message = intent.getStringExtra("message");
new AlertDialog.Builder(BooksActivity.this).setTitle("提示")
.setMessage(message).setPositiveButton("确定", null)
.show();
}
}, filter);
事实上与继承BroadcastReceiver的区别并不大,主要代码是registerReceiver,参数是BroadcastReceiver(或子类)及一个IntentFilter,该IntentFilter也必须指定Action且与发送端一致。
与第一种方法不同,或者说最大的区别,应该是此方法不需要在AndroidManifest.xml中注册Receiver,registerReciver方法本身就是注册的方法,所以第一种方式称为静态注册法,第二种方式称为动太注册法。