今天我们一起来学习一下如何在应用程序中发生自定义的广播,前面已经介绍过了,广播主要分为两种类型,标准广播和有序广播,在本节中我们就将通过实践的方式来看下这两种广播具体的区别。
发送标准广播
在发送广播之前,我们还是需要先定义一个广播接收器来准备接收此广播才行,不然发出去也是白发。因此新建一个MyBroadcastReceiver 继承自BroadcastReceiver,代码如下所示:
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
/**
* Created by 权兴权意 on 2016/9/27.
*/
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"Received in MyBroadcastReceiver",Toast.LENGTH_SHORT).show();
}
}
这里当MyBroadcastReceiver 收到自定义的广播时,就会弹出Received in MyBroadcastReceiver的提示。然后在AndroidManifest.xml 中对这个广播接收器进行注册:
<receiver android:name=".MyBroadcastReceiver">
<intent-filter>
<action android:name="com.quan.car.mybroadcast.MY_BROADCAST"/>
</intent-filter>
</receiver>
接下来修改activity_main.xml 中的代码,添加一个Button按钮作为发送广播的触发点,如下所示:
<Button
android:id="@+id/mybr_btn_main"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="MyBroadcastReceiver"
/>
mybr_btn_main = (Button) findViewById(R.id.mybr_btn_main);
mybr_btn_main.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
sendBroadcast(new Intent("com.quan.car.mybroadcast.MY_BROADCAST"));
}
});
可以看到,我们在按钮的点击事件里面加入了发送自定义广播的逻辑。首先构建出了一个Intent 对象,并把要发送的广播的值传入,然后调用了Context 的sendBroadcast()方法将广播发送出去,这样所有监听MY_BROADCAST 这条广播的广播接收器就会收到消息。此时发出去的广播就是一条标准广播。
运行程序点击Button即可看到效果:
广播是一种可以跨进程的通信方式,这一点从前面接收系统广播的时候就可以看出来了。因此在我们应用程序内发出的广播,其他的应用程序应该也是可以收到的。
发送有序广播
不过到目前为止,程序里发出的都还是标准广播,我们还可以尝试一下发送有序广播。
发送有序广播只需要改动一行代码, 即将sendBroadcast() 方法改成sendOrderedBroadcast()方法。sendOrderedBroadcast()方法接收两个参数,第一个参数仍然是Intent,第二个参数是一个与权限相关的字符串,这里传入null 就行了。
这个时候的广播接收器是有先后顺序的,而且前面的广播接收器还可以将广播截断,以阻止其继续传播。
那么该如何设定广播接收器的先后顺序呢?当然是在注册的时候进行设定的了,修改AndroidManifest.xml 中的代码,如下所示:
android:priority="100"
我们通过android:priority 属性给广播接收器设置了优先级,优先级比较高的广播接收器就可以先收到广播。
既然已经获得了接收广播的优先权,那么就可以选择是否允许广播继续传递了。如果在onReceive()方法中调用了abortBroadcast()方法,就表示将这条广播截断,后面的广播接收器将无法再接收到这条广播。