发送标准广播
发送广播之前,我们还是需要先定义一个广播接收器来准备接收此广播才行,不然发出去也是白发。因此新建一个MyBroadcastReceiver 继承自BroadcastReceiver
1. 定义一个广播接收器 MyBroadcastReceiver extends BroadcastReceiver,重写onReceive()方法
2. 在AndroidManifest注册receiver
接收广播测试:
项目A:
1. 创建广播接收器
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "在项目A广播中接收", Toast.LENGTH_SHORT).show(); //要广播的消息写在onReceiver
}
}
2. 在AndroidManifest.xml中注册receiver
<receiver android:name=".MyBroadcastReceiver"> //注册Receiver,定义一个action的name
<intent-filter>
<action android:name="com.example.k.MY_BROADCAST" /> //此处可以自定义name,只要与java中Intent中的值一致
</intent-filter>
</receiver>
3. MainActivity.java中
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("com.example.k.MY_BROADCAST"); //Intent的值为receiver的action的name
sendBroadcast(intent); //发送广播
}
});
}
}
标准广播:
发送有序广播
通过com.example.l.MY_BROADCAST这个值来关联使A与B关联。
项目B(仅仅只含有一个广播接收器)
1. 创建广播接收器(与上一个app类似)
public class SecondBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "在项目B广播中接收", Toast.LENGTH_SHORT).show(); //要广播的消息写在onReceiver
}
}
2. 在AndroidManifest.xml中注册receiver(与上一个app类似)
<receiver android:name=".SecondBroadcastReceiver"> //注册Receiver,定义一个action的name
<intent-filter>
<action android:name="com.example.k.MY_BROADCAST" /> //此处与上一个app的name的值一致
</intent-filter>
</receiver>
3. 修改项目A 的MainActivity.java,变为sendOrderedBroadcast(intent, null) 方法
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("com.example.l.MY_BROADCAST");
sendOrderedBroadcast(intent, null); //与权限相关的字符串,传入null就行
}
});
}
}
有序广播:
两个程序都会接收到这条广播,但是有先后顺序。此处顺序为“在项目A广播中接收”,“在项目B广播中接收”
设定接收广播的顺序:
AndroidManifest.xml
<receiver android:name=".MyBroadcastReceiver">
<intent-filter android:priority="100" > //此处即设置了优先级,最高级为100
<action android:name="com.example.broadcasttest.MY_BROADCAST"/>
</intent-filter>
</receiver>
在MyBroadcastReceiver.java中,调用abortBroadcast()方法,表示该广播被截断,后面的广播接收器将无法再接收到这条广播。
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "received in MyBroadcastReceive",Toast.LENGTH_SHORT).show();
abortBroadcast(); //无法接收第二个广播,只弹出"在项目A广播中接收"。说明这条广播经过MyBroadcastReceiver之后确实是终止传递了
}
}