一、广播机制的基本概念

当某个事件产生时(如一条短信发来或一个电话打来),android操作系统会把这个事件广播给所有注册的广播接收者,需要处理这个事件的广播接收者进行处理。其实这就是日常生活中的广播。发生一个新闻后,广播电台会广播这个新闻给打开收音机的人,对这个新闻感兴趣的人会关注,可能会拿笔记下。新闻就是事件,广播电台就是android系统,打开收音机的人就是广播接收者,感兴趣的人就是需要处理该事件的广播接收者,拿笔记下就是对该事件进行的操作。


二、广播的分类——普通广播和有序广播

①普通广播:完全异步,逻辑上可以被任何广播接收者接收到。优点是效率较高。缺点是一个接收者不能将处理结果传递给下一个接收者,并无法终止广播intent的传播。


②有序广播:按照被接收者的优先级顺序,在被接收者中一次传播。比如有三个广播接收者A,B,C,优先级是A > B > C。那这个消息先传给A,再传给B,最后传给C。每个接收者有权中终止广播,比如B终止广播,C就无法接收到。此外A接收到广播后可以对结果对象进行操作,当广播传给B时,B可以从结果对象中取得A存入的数据。如系统收到短信发出的广播就是有序广播。


三、注册广播接收者的两种方式

①在AndroidManifest.xml中注册

在配置文件中注册的接收者的特点是即使应用程序已被关闭,该接收者依然可接受它感兴趣的广播,比如手机电池电量的广播接收者,没有必要将某个程序开启。下面的例子1、2广播接收者会接收到拨打电话的广播。

    <application android:icon="@drawable/icon" android:label="@string/app_name">        <activity android:name=".MainActivity"                  android:label="@string/app_name">            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>                <!-- 广播接收者1--><receiver android:name=".BroadcastReceiver1"><intent-filter><action android:name="android.intent.action.CALL"></action></intent-filter></receiver><!-- 广播接收者2 --><receiver android:name=".BroadcastReceiver2"><intent-filter><action android:name="android.intent.action.CALL"></action></intent-filter></receiver><!-- 广播接收者3 --><receiver android:name=".BroadcastReceiver3"><intent-filter><action android:name="android.intent.action.PICK"></action></intent-filter></receiver>    </application>
/** * 模拟拨打电话广播 *  * @author 徐越 *  */public class MainActivity extends Activity{@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);Intent intent = new Intent();intent.setAction("android.intent.action.CALL");this.sendBroadcast(intent);}}/** * 每次接收广播都会生成新的BroadcastReceiver1,当处理完onReceive方法后就不会再被使用 * 再次接收就在生成新的BroadcastReceiver1对象 *  * @author 徐越 *  */public class BroadcastReceiver1 extends android.content.BroadcastReceiver{public BroadcastReceiver1(){Log.i("xy_Receiver", "construtor1");}@Overridepublic void onReceive(Context context, Intent intent){Log.i("xy_Receiver", "onReceive1");}}/** * 广播接收者2 *  * @author 徐越 *  */public class BroadcastReceiver2 extends android.content.BroadcastReceiver{public BroadcastReceiver2(){Log.i("xy_Receiver", "construtor2");}@Overridepublic void onReceive(Context context, Intent intent){Log.i("xy_Receiver", "onReceive2");}}/** * 广播接收者3 *  * @author 徐越 *  */public class BroadcastReceiver3 extends android.content.BroadcastReceiver{public BroadcastReceiver3(){Log.i("xy_Receiver", "construtor3");}@Overridepublic void onReceive(Context context, Intent intent){Log.i("xy_Receiver", "onReceive3");}}

②在Activity中注册

在Activity中绑定接收者必须依附该应用程序存在,或者一个BroadcastReceiver用于更新UI,就没有必要再程序关闭时接收者还运行,故无需在AndroidManifest.xml中注册而可以放在Activity中注册。

/** * Activity中注册广播接收者 *  * @author 徐越 *  */public class MainActivity extends Activity{private BroadcastReceiver receiver;private static final String CALL_ACTION = "android.intent.action.CALL";@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);}/** * 模拟发送一个电话的广播 *  * @param v */public void sendBroadCast(View v){Intent intent = new Intent();intent.setAction("android.intent.action.CALL");this.sendBroadcast(intent);}public void bindReceiver(View v){receiver = new BroadcastReceiver();IntentFilter intentFilter = new IntentFilter();intentFilter.addAction(CALL_ACTION);this.registerReceiver(receiver, intentFilter);}public void unBindReceiver(View v){this.unregisterReceiver(receiver);}}public class BroadcastReceiver extends android.content.BroadcastReceiver{@Overridepublic void onReceive(Context context, Intent intent){Log.i("xy", "receiver");}}



更多相关文章

  1. 监听Android设备网络变化 - 亲测在华为Emui8.0 以及 Android原生
  2. 手机管理应用研究【4】—— 手机加速篇
  3. API接口JWT方式的Token认证(下),客户端(Android)的实现
  4. Android(安卓)4.0 消息广播无法接收的原因
  5. android各种ui效果库
  6. Android(安卓)桌面组件【app widget】 进阶项目--心情记录器
  7. 初学Android,BroadcastReceiver之有序广播(七十一)
  8. Service使用技巧,一些不为人知的功能 [移动平台 Android]
  9. android移动平台——移动SNS(二):注册登录

随机推荐

  1. Android手机客户端与Servlet交换数据(by
  2. 修改android项目sdk版本的方法
  3. android中AudioRecord采集音频的参数说明
  4. android animation的两种应用实例
  5. Android学习之ProgressDialog
  6. Android中文API(128) —— HandlerThread
  7. List 去除一些默认设置
  8. Activity从入门到放弃
  9. Android(安卓)布局加载源代码分析
  10. eclipse android 项目报错 ERROR: Unable