广播及广播接收器
1.BroadCast 广播:
使用很简单,实例化一个意图对象,把要发送的信息封装在意图对象中,然后使用
Context。sendBroadCast()方法,把意图对象发送(即广播)出去。
代码示例:
//用给出的action创建一个意图对象,该action在广播过滤器中要用到
Intent intent = new Intent("bc1");
//要广播的信息
intent.putExtra("val", BroadcastReceiver1.class.getName());
//发送广播
sendBroadcast(intent);
2.BroadCastReceiver广播接收器:
必须建立一个广播接收器来接收广播消息,广播接收器的核心是过滤器IntentFilter。
建立广播接收器分为静态建立和动态建立:
首先要新建一个广播接收类继承BroadcastReceiver,重写onReceive方法;
代码示例,BroadcastReceiver1 .java:
public class BroadcastReceiver1 extends BroadcastReceiver {
@Override
public void onReceive(Context arg0, Intent arg1) {
String val = arg1.getStringExtra("val");
Toast.makeText(arg0, "Get message:"+val, Toast.LENGTH_LONG).show();
}
}
①如果是静态建立:在清单文件中注册BroadCastReceiver;
代码示例,AndroidManifest.xml:
<receiver android:name=".BroadcastReceiver1"> <intent-filter > <action android:name="bc1"/> </intent-filter> </receiver>
receiver节点的android:name是广播接收类的类名,intent-filter节点的android:name为要过滤的广播消息,只接受
action="bc1"的广播。
这样通过sendBoardCast(intent)发送出来的广播,被该广播接收器通过广播过滤器匹配后接收,并通过onReceive()方
法处理接收到的信息,完成了整个信息传递的过程。
②如果是动态建立,不需要在清单文件中注册BroadCastReceiver,在发送广播的类中实例化一个IntentFiltler的成员变
量,并在onStart()方法中注册广播过滤器,在onStop()方法中注销广播过滤器。
代码示例:
public class MainAct extends Activity {
IntentFilter intentFilter = new IntentFilter();
BroadcastReceiver2 bc2 = new BroadcastReceiver2();
......
@Override
protected void onStart() {
super.onStart();
intentFilter.addAction("bc2");
registerReceiver(bc2, intentFilter);//注册监听
}
@Override
protected void onStop() {
super.onStop();
unregisterReceiver(bc2); //取消监听
}
}
--------------------------------------------------本示例完整代码--------------------------------------------------------------
AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.wyx.demo" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="8" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".MainAct" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <receiver android:name=".BroadcastReceiver1"> <intent-filter > <action android:name="bc1"/> </intent-filter> </receiver> </application> </manifest>
MainAct.java:
/**
* 该页面负责发送广播信息:
* 发送广播消息,把要发送的信息和用于过滤的信息(如Action、Category)装入一个Intent对象,
* 然后通过调用 Context.sendBroadcast()、sendOrderBroadcast()或sendStickyBroadcast()方法,
* 把 Intent对象以广播方式发送出去。
*/
public class MainAct extends Activity {
IntentFilter intentFilter = new IntentFilter();
BroadcastReceiver2 bc2 = new BroadcastReceiver2();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btn1 = (Button)findViewById(R.id.btn1);
btn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("bc1");
intent.putExtra("val", BroadcastReceiver1.class.getName());
sendBroadcast(intent);
}
});
Button btn2 = (Button)findViewById(R.id.btn2);
btn2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("bc2");
intent.putExtra("val", BroadcastReceiver2.class.getName());
sendBroadcast(intent);
}
});
}
@Override
protected void onStart() {
super.onStart();
intentFilter.addAction("bc2");
registerReceiver(bc2, intentFilter);//注册监听
}
@Override
protected void onStop() {
super.onStop();
unregisterReceiver(bc2); //取消监听
}
}
BroadcastReceiver1.java:
public class BroadcastReceiver1 extends BroadcastReceiver {
@Override
public void onReceive(Context arg0, Intent arg1) {
String val = arg1.getStringExtra("val");
Toast.makeText(arg0, "Get message:"+val, Toast.LENGTH_LONG).show();
}
}