BroadcastReceiver的两种实现方式

来源:互联网 发布:网络销售的意义 编辑:程序博客网 时间:2024/04/24 16:24

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

0 0