一、自定义广播
1.有序广播
基于前面的标准广播,再新建一个 BroadcastTest2 项目(new Project)。在新建的项目下定义一个广播接收器,来接受标准广播中的自定义广播。新建 AnotherBroadcastReceiver ,代码:
public class AnotherBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "received in AnotherBroadcastReceiver", Toast.LENGTH_SHORT).show();
}
}
修改 AndroidMainfest.xml 中的代码:
<receiver
android:name=".AnotherBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.example.broadcasttest.MY_BROADCAST"/>
</intent-filter>
</receiver>
回到模拟器上,点击 button,会弹出两次提示信息:
这样就证明了我们应用程序的广播可以被其他程序所接收。
接下来是有序广播。
修改 BroadcastTest 中 MainActivity 的代码:
Button button = (Button) findViewById(R.id.button_l);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new
Intent("com.example.broadcasttest.MY_BROADCAST");
sendOrderedBroadcast(intent,null);
}
});
此处 sendOrderedBroadcast()方法接收两个参数,第一个是 Intent,第二个是权限相关的字符串,此处传入 null 即可。为了体现有序广播的特点,我们将修改 AndroidMainfest.xml 中的代码:
<receiver
android:name=".MyBroadcastReceiver"
android:enabled="true"
android:exported="true">
<!-- android:priority 属性用于给广播器设置优先级,此处优先级设置为100 -->
<intent-filter android:priority="100">
<action android:name="com.example.broadcasttest.MY_BROADCAST"/>
</intent-filter>
</receiver>
以及 MyBroadcastReceive 中的代码:
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "received in MyBroadcastReceiver", Toast.LENGTH_SHORT).show();
// abortBroadcast()方法表示将这条广播截断,后面的广播接收器将无法接收这条广播
abortBroadcast();
}
}
重新运行程序,点击 button ,只有 MyBroadcastReceiver 的 Toast 信息能够弹出。
二、本地广播
1.本地广播
使用本地广播机制发出的广播只能在应用程序的内部传递,广播接收器也只能接收来自本程序发出的广播。本地广播使用 LocalBroadcastManager 来管理广播,并提供了发送广播和注册广播接收器的方法。
优点:
□ 广播不会离开应用程序,不用担心机密数据泄露
□ 其他程序的广播无法发送到应用程序内部,不会存在安全漏洞的隐患
□ 比系统全局广播更加高效
修改 MainAcitivity 中的代码:
public class MainActivity extends AppCompatActivity {
private IntentFilter intentFilter;
private LocalReceiver localReceiver;
private LocalBroadcastManager localBroadcastManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取实例
localBroadcastManager = LocalBroadcastManager.getInstance(this);
Button button = (Button) findViewById(R.id.button_l);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new
Intent("com.example.broadcasttest.LOCAL_BROADCAST");
localBroadcastManager.sendBroadcast(intent);
//发送本地广播
}
});
intentFilter = new IntentFilter();
intentFilter.addAction("com.example.broadcasttest.LOCAL_BROADCAST");
localReceiver = new LocalReceiver();
localBroadcastManager.registerReceiver(localReceiver,intentFilter);
}
//动态注册的广播接收器一定都要取消注册
protected void onDestroy() {
super.onDestroy();
localBroadcastManager.unregisterReceiver(localReceiver);
//注册本地广播接收器
}
class LocalReceiver extends BroadcastReceiver {
public void onReceive(Context context,Intent intent){
Toast.makeText(context,"receive local broadcast",Toast.LENGTH_SHORT).show();
}
}
}
点击 button 会弹出 Toast 信息,但 BroadcastTest2 却无法接收到 com.example.broadcasttest.LOCAL_BROADCAST 这条广播。
小结:将基础的有序广播和本地广播的代码敲了一遍,通过实例来例假两种广播的特性。