可以通过发送广播传送数据
1.发送无序广播,调用sendBroadcase(intent) 即可,给 intent 设置 action ,也可以携带数据
public void sendbroadcast(View v){
Intent intent=new Intent();
intent.setAction("com.wanhao");
sendBroadcast(intent);
}
接收广播时,同一手机上的任何注册了广播接收者,指定了对应action就可以接收广播,与接收系统广播别无二致。
<receiver android:name="com.Receiver">
<intent-filter>
<action android:name="com.wanhao"/>
</intent-filter>
</receiver>
2.发送有序的广播。可以指定收到广播的顺序。
先指定发送广播者:
public void sendbroadcast(View v){
Intent intent=new Intent();
intent.setAction("com.wanhao.sendrice");
//收到广播时,需要的权限
String receiverPermission=null;
//广播最后的接收者
BroadcastReceiver resultReceiver = new FinalReceiver();
//处理最终的广播接收者用到的handler 传入null,会在主线程处理
Handler scheduler=null;
//初始化的数据
String initialData="everyone will get 1 ton;";
Bundle initialExtras=null;
int initialCode = Activity.RESULT_OK;
sendOrderedBroadcast(intent, receiverPermission, resultReceiver, scheduler, initialCode, initialData, initialExtras);
}
其中resultReceiver 也在发送广播的程序中指定,可以处理最后一次数据(不必在AndroidManifest.xml中配置receiver)
public class FinalReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String result=getResultData();
Toast.makeText(context,"Final:"+ result, Toast.LENGTH_SHORT).show();
}
}
然后是接收者,
第一个接收者:
@Override
public void onReceive(Context context, Intent intent) {
String result=getResultData();
Toast.makeText(context, result, Toast.LENGTH_SHORT).show();
setResultData("everybody 0.9 ton");
}
第二个接收者
@Override
public void onReceive(Context context, Intent intent) {
String result=getResultData();
Toast.makeText(context, result, Toast.LENGTH_SHORT).show();
setResultData("everybody 0.7 ton");
//终止有序广播的向下传递
//abortBroadcast();
}
第三个接收者 @Override
public void onReceive(Context context, Intent intent) {
String result=getResultData();
Toast.makeText(context, result, Toast.LENGTH_SHORT).show();
setResultData("everybody 0.5 ton");
}
第四个接收者
@Override
public void onReceive(Context context, Intent intent) {
String result=getResultData();
Toast.makeText(context, result, Toast.LENGTH_SHORT).show();
}
最后每个receive在清单文件中配置,并设置优先级
<receiver android:name="com.wanhao.StateReceiver">
<intent-filter android:priority="1000">
<action android:name="com.wanhao.sendrice"/>
</intent-filter>
</receiver>
<receiver android:name="com.wanhao.CityReceiver">
<intent-filter android:priority="900">
<action android:name="com.wanhao.sendrice"/>
</intent-filter>
</receiver>
<receiver android:name="com.wanhao.TownReceiver">
<intent-filter android:priority="800">
<action android:name="com.wanhao.sendrice"/>
</intent-filter>
</receiver>
<receiver android:name="com.wanhao.FamersReceiver">
<intent-filter android:priority="700">
<action android:name="com.wanhao.sendrice"/>
</intent-filter>
</receiver>
发送有序广播还有种比较简单的方式,sendOrderedBroadcase(intent ,receivePermission);可以让 intent 携带数据,第二个参数表示收到广播需要的权限。
如何区分有序广播和无序广播,在onReceive方法中调用abortbroadcase(); 若是无异常,表示可以终止广播传递,为有序广播,反之为无序广播。
比较有序广播与无序广播
3.特殊广播接收者
四大组件只有广播接收者可以不在清单文件中注册
静态注册:当程序发布到设备上,会解析下 receiver 以及 action ,正常情况下,发下来就会接收到。
动态注册:解锁等频繁使用广播,在activity启动时注册,关闭时注销
注册接收者 registerReceiver(receiver,filter);
注销接收者 unregisterReceiver(receiver)
private BroadcastReceiver receiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//广播接收者对象
receiver=new DynasticReceiver();
//意图过滤器对象
IntentFilter filter=new IntentFilter();
filter.addAction("android.intent.action.SCREEN_ON");
filter.addAction("android.intent.action.SCREEN_OFF");
//动态注册一个广播接收者
registerReceiver(receiver,filter);
}
@Override
protected void onDestroy() {
super.onDestroy();
//动态注册的广播接收者 在当前activity结束时,一定要注销掉receiver广播接收者(unregisterReceiver)
unregisterReceiver(receiver);
}
receiver:
public class DynasticReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if("android.intent.action.SCREEN_ON".equals(intent.getAction())){
System.out.println("屏幕开启!");
}else if("android.intent.action.SCREEN_OFF".equals(intent.getAction())){
System.out.println("屏幕关闭!");
}
}
}