您的位置:首页 > 移动开发 > Android开发

点滴:Android BroadcastReceiver【转】

2014-01-13 16:38 423 查看


1.BroadCast 广播:

使用很简单,实例化一个意图对象,把要发送的信息封装在意图对象中,然后使用

Context。sendBroadCast()方法,把意图对象发送(即广播)出去。


代码示例:

Java代码


//用给出的action创建一个意图对象,该action在广播过滤器中要用到

Intent intent = new Intent("bc1");

//要广播的信息

intent.putExtra("val", BroadcastReceiver1.class.getName());

//发送广播

sendBroadcast(intent);



2.BroadCastReceiver广播接收器:

必须建立一个广播接收器来接收广播消息,广播接收器的核心是过滤器IntentFilter。

建立广播接收器分为静态建立和动态建立:

首先要新建一个广播接收类继承BroadcastReceiver,重写onReceive方法;


代码示例,BroadcastReceiver1 .java:

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:

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()方法中注销广播过滤器。


代码示例:

Java代码


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代码


<?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:

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:

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();

}

}

Context.sendBroad()主要是用来广播无序事件(也被称为有序广播 Normal broadcast),即所有的接收者在理论上是同时接收到事件,同时执行的,对消息传递的效率而言这是比较好的做法。

Context.sendOrderedBroadcast()方法用来向系统广播有序事件(Ordered broadcast),接收者按照在Manifest.xml文件中设置的接收顺序依次接收Intent,顺序执行的,接收的优先级可以在系统配置文件中设置(声明在intent-filter元素的android:priority属性中,数值越大优先级别越高,其取值范围为-1000到1000。当然也可以在调用IntentFilter对象的setPriority()方法进行设置)。对于有序广播而言,前面的接收者可以对接收到得广播意图(Intent)进行处理,并将处理结果放置到广播意图中,然后传递给下一个接收者,当然前面的接收者有权终止广播的进一步传播。如果广播被前面的接收者终止后,后面的接收器就再也无法接收到广播了。

广播接收器(Broadcaset)运行的线程:

无论对于有序广播还是无序广播,广播接收器默认都是运行在主线程中的(main线程,即UI线程)。可以通过在程序中使用registerReceiver(receiver, filter, broadcastPermission, scheduler)方法中的最后一个参数指定要运行的广播接收器的线程。也可以在Manifest.xml文件中设置(Intent-filter标签中设置android:process)。

无序广播(Normal Broadcast)

基本步骤:写一个类继承BroadcastReceiver,并重写onReceive方法,而后在AndroidManifest.xml文中中进行配置,或者直接在代码中注册。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: