Android学习之广播事件处理
在Android中,Broadcast是一种广泛运用的在应用程序之间传输信息的机制。我们拿广播电台来做个比方。我们平常使用收音机收音是这样的:许许多多不同的广播电台通过特定的频率来发送他们的内容,而我们用户只需要将频率调成和广播电台的一样就可以收听他们的内容了。Android中的广播机制就和这个差不多的道理。电台发送的内容是语音,而在Android中我们要发送的广播内容是一个Intent。这个Intent中可以携带我们要传送的数据。
电台通过大功率的发射器发送内容,而在Android中则是通过sendBroadcast这个方法来发送(很形象的名字吧)。
用户通过调整到具体的电台频率接受电台的内容。而在Android中要接受广播中的内容则是通过注册一个BroadCastReceiver来接收的。只有发送广播的action和接收广播的action相同,接受者才能接受这个广播。
广播有什么用
其实,在什么是广播的第一句就已经说明了广播有什么用了。对了,笼统一点讲就是用来传输数据的。具体一点说就是:
1.实现了不同的程序之间的数据传输与共享,因为只要是和发送广播的action相同的接受者都能接受这个广播。典型的应用就是android自带的短信,电话等等广播,只要我们实现了他们的action的广播,那么我们就能接收他们的数据了,以便做出一些处理。比如说拦截系统短信,拦截易做图扰电话等等
2.起到了一个通知的作用,比如在service中要通知主程序,更新主程序的UI等。因为service是没有界面的,所以不能直接获得主程序中的控件,这样我们就只能在主程序中实现一个广播接受者专门用来接受service发过来的数据和通知了。
Android广播机制包含三个基本要素:
广播(Broadcast)----- 用于发送广播。
广播接收器(BroadcastReceiver)----- 用于接收广播。
意图内容(Intent)----- 用于保存广播相关信息的媒介。
Broadcast是一种广泛应用的在应用程序之间传输信息的机制。而BroadcastReceiver是对发出来的Broadcast进行过滤接受并响应的组件。
下面对广播的过程进行详细的描述:
首先在需要发送信息的地方,把要发送的信息和用于过滤的信息(如Action、Category)装入一个Intent对象,然后通过调用Context.sendBroadcast()、Context.sendOrderBroadcast()或Context.sendstickyBroadcast()方法,把Intent对象以广播的方式发出去。
当Intent发送以后,所有已经注册的BroadcastReceiver会检查注册时的Intentfilter是否与发送的Intent相匹配,若匹配就会调用BroadcastReceiver的void onReceive(Context curContext, Intent broadcastMsg)方法。
广播的生命周期:
广播接收器仅在它执行这个方法时处于活跃状态。当onRecever()返回后,它就变为失活状态。
拥有一个活跃状态的广播接收器的进程被保护起来不会被杀死,但仅拥有失活状态组件的进程则会在其他进程需要它所占用的内存时被杀死。所以,如果响应一个广播信息需要很长一段时间,我们一般会将其纳入一个衍生的线程中去完成,而不是在主线程中去完成它,从而保证用户交互过程的流畅性。
注册BroadcastReceiver的两种方法:
方式一,静态的在AndroidManifest.xml中用<receiver>标签声明注册,并在标签内用<intent-filter>标签注册过滤器。
方式二,动态地在代码中先定义并设置好一个IntentFilter对象,然后在需要注册的地方调用Context.registerReceiver()方法,如果取消时就调用Context.unregisterReceiver()方法。如果用动态方式注册的BroadcastReceiver的Context对象被销毁时,BroadcastReceiver也就自动取消注册了。
另外,若在使用sendBroadcast()的方法是指定了接收权限,则只有在AndroidManifest.xml中用<uses-permission>标签声明了拥有此权限的BroadcastReceiver才会有可能接收到发送来的Broadcast。同样,若在注册BroadcastReceiver时指定了可接收的Broadcast的权限,则只有在保内的AndroidManifest.xml中用<uses-permission>标签声明了,拥有此权限的Context对象所发送的Broadcast才能被这个BroadcastReceiver接收。
动态注册:
IntentFilter intentFilter = new IntentFilter();
intentFilter.add(Action); //为BroadcastReceiver指定action,使之用于接收同action的广播。
registerReceiver(BroadcastReceiver, intentFilter);
一般在onStart()中注册,onStop()中取消。指定广播目标Action:Intent intent = new Intent(action--String),指定了此action的receiver会接收此广播。
这里用一个实例来看一下如何处理广播事件
我们按照如下步骤来实现:
1、创建一个类继承BroadcastReceiver类,复写onReceive()方法
2、在AndroidManifest.xml文件中注册BroadcastReceiver
3、构建Intent对象
4、调用sendBroadCast()方法发送广播
创建的工程目录结构:
代码:
MainActivity.java
[html]
package com.boradcast.activity;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends Activity {
protected static final String ACTION = "com.wulianghuan.broadcast.action";
@Override www.zzzyk.com
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
public void click(View v){
Intent intent = new Intent();
intent.putExtra("name", "wulianghuan");
intent.setAction(ACTION);
sendBroadcast(intent);
}
}
MyReceiver.java
[html]
package com.broadcast.receive;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
public class MyReceiver extends BroadcastReceiver{
private static final String TAG = "MyReceiver";
@Override
public void onReceive(Context context, Intent intent) {
String name = intent.getStringExtra("name");
Log.i(TAG, name);
}
}
AndroidManifest.xml
[html]
<receiver android:name="com.broadcast.receive.MyReceiver">
<intent-filter>
<action android:name="com.wulianghuan.broadcast.action"/>
</intent-filter>
</receiver>
运行界面: