无序广播
没有顺序的广播,所有广播中的action匹配的广播可以收到这一条广播,并且是没有先后顺序,视为同时收到。abortBroadcast()拦截广播和setResultData()修改参数在无序广播里面是没有效果的。
有序广播:
没有顺序的广播,所有与广播action匹配的广播者都可以收到这一条广播,但是有先后的顺序,按照广播接受者的优先级接收。广播接收者需要提前设置优先级,优先级高的先接
收到广播,优先级数值为-1000~1000,在AndroidManifest.xml的<intent-filter android:priority="xxx">设置;比如存在3个广播接收者A、B、C,优先级A>B>C,因此A最先收到广播,当
A收到广播后,可以向广播中添加一些数据给下一个接收者(intent.putExtra()),或者终止广播(abortBroadcast());Context.sendOrderedBroadcast(intent);
//resultReceiver(new MyReceiver())不需要在清单文件中配置,这个广播接收者只接受该条有序广播,并且是最后收到该广播,并且一定可以接收到,打电话的广播也是这种方式,无法拦截。
sendOrderedBroadcast(intent, null, new MyReceiver(), null, 0, "每个人100元", null);
案例代码
app1:发送广播
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="发送文件"
android:onClick="click"
/>
</RelativeLayout>
MainActivity.java
package com.ldw.center;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void click(View v){
Intent intent = new Intent();
intent.setAction("com.ldw.sendcast");
//发送有序广播
//resultReceiver(new MyReceiver())不需要在清单文件中配置,这个广播接收者只接受该条有序广播,并且是最后收到该广播,并且一定可以接收到
sendOrderedBroadcast(intent, null, new MyReceiver(), null, 0, "每个人100元", null);
}
//广播接收者对象,和app2里面不同的是,app2里面不需要定义,自动调用的接收者类,这里面需要定义这个类
class MyReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
String text = getResultData();
System.out.println("MyReceiver收到" + text);
}
}
}
app2:广播接收者
清单文件
<receiver android:name="com.ldw.local.top1">
<intent-filter android:priority="1000">
<action android:name="com.ldw.sendcast"/>
</intent-filter>
</receiver>
<receiver android:name="com.ldw.local.top2">
<intent-filter android:priority="800">
<action android:name="com.ldw.sendcast"/>
</intent-filter>
</receiver>
<receiver android:name="com.ldw.local.top3">
<intent-filter android:priority="600">
<action android:name="com.ldw.sendcast"/>
</intent-filter>
</receiver>
top1.java
package com.ldw.local;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class top1 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
System.out.println("top1接受到广播");
String text = getResultData();
System.out.println("top1" + text);
//有序广播修改参数值
setResultData("每个人收到80元");
}
}
top2.java
package com.ldw.local;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class top2 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
System.out.println("top2接受到广播");
String text = getResultData();
System.out.println("top2" + text);
//有序广播可以拦截广播,,后面的接受不到
abortBroadcast();
}
}
top3.java
package com.ldw.local;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class top3 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
System.out.println("top3接受到广播");
String text = getResultData();
System.out.println("top3" + text);
}
}