BroadcastReceiver的两种实现方式

        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方法本身就是注册的方法,所以第一种方式称为静态注册法,第二种方式称为动太注册法。

    原文作者:Roger Luo
    原文地址: https://blog.csdn.net/geloin/article/details/42103689
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞