自定义广播

安卓允许用户发送自定义广播(broadcast),满足接收条件的接收器(receiver)就可以接受自定义广播。

发送自定义广播

自定义广播分为标准(无序)自定义广播以及有序自定义广播:

sendBroadcast(Intent intent); //发送标准自定义广播
sendOrderedBroadcast(Intent, null); //发送有序自定义广播

标准自定义广播是任何满足条件的接收器都可以接受。
有序自定义广播的第二个参数是接受权限,一般为null。有序广播接收器可以设置接收优先级priority,优先级高的先收到广播,并且可以设置截断广播,这样之后的接收器就无法接受广播。

接受自定义广播

接受自定义广播一般使用静态接受,即在AndroidManifest.xml中注册接收器,这样应用即使未运行,也可以响应广播:

<manifest>
    ......
    <application>
        ......
        <receiver android:name=".MyBroadcast(接收器类)">
            <intent-filter android:priority="100(优先级)">
                <action android:name="MY_BROADCAST(自定义的广播)" />
            </intent-filter>
        </receiver>
        ......
    </application>
</manifest>

示例

我们新建2个工程:BroadcastTest1和BroadcastTest2。BoardcastTest1的主活动中添加一个按钮发送自定义的广播"Example.MY_Broadcast",然后两个工程中都添加接收器用来接收这个广播,接收后弹出toast通知。项目1的toast要比项目2的先提示。
先来写项目1发送广播,发送广播要利用Intent类的实例,如下:

//BroadcastTest1.MainActivity: 项目1的主活动发送广播
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ... ...
        Button button =(Button)findViewById(R.id.button_broadcast);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent("Example.MY_BROADCAST");
                sendOrderedBroadcast(intent, null);
            }
        });
        ... ...
    }
}

第一个项目的接收器类,继承BroadcastReceiver并重写其中的onReceive()方法,这个方法就是接收器接收到广播后要执行的,注意的是不要写太多内容,如果onReceive()方法执行时间过长会报错:

//BroadcastTest1.MyBroadcastReceiver:项目1的接收器类
public class MyBoardcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "BroadcastTest1:Example.MY_BROADCAST", Toast.LENGTH_LONG).show;
    }
}

之后要在项目1的主配置文件中注册接收器,并设置优先级为100:

<!--BraodcastTest1.AndroidManifest.xml-->
<manifest ......>
    <application ......>
        ......
        <receiver android:name=".MyBroadcastReceiver">
            <intent-filter android:priority="100">
                <action android:name="Example.MY_BROADCAST" />
            <intent-filter>
        </receicer>
        ......
    </application>
</manifest>

接下来写项目2的接收器,基本上与项目1相同,不过我们不设置优先级,这样一定会先提示项目1的toast。如下:

//BroadcastTest2.MyBroadcastReceiver:项目2的接收器类
public class MyBoardcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "BroadcastTest2:Example.MY_BROADCAST", Toast.LENGTH_LONG).show;
    }
}
<!--BraodcastTest2.AndroidManifest.xml-->
<manifest ......>
    <application ......>
        ......
        <receiver android:name=".MyBroadcastReceiver">
            <intent-filter>
                <action android:name="Example.MY_BROADCAST" />
            <intent-filter>
        </receicer>
        ......
    </application>
</manifest>

编译下两个工程测试吧,项目中其他的部分请自行完善。另外,一些非原生安卓ROM实现静态接受广播需要给应用“自动运行”权限。

关于截断广播

截断广播在接收器类中使用abortBroadcast()方法,我们修改项目1的接收器类,加上这个方法:

//BroadcastTest1.MyBroadcastReceiver:项目1的接收器类
public class MyBoardcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "BroadcastTest1:Example.MY_BROADCAST", Toast.LENGTH_LONG).show;
        abortBroadcast();
    }
}

再次编译项目1测试,这次只有项目1的toast通知,没有项目2的toast通知。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 现在你已经学会了通过广播接收器来接受系统广播,接下来我们就要学习一下如何在应用程序中发送自定义广播。前面已经介绍过...
    AndYMJ阅读 8,799评论 4 0
  • 发送自定义广播 广播分类:标准广播、有序广播标准广播:所有程序都可以同时接收到(完全异步执行) 有序广播:优先级高...
    溪_午阅读 1,535评论 0 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,833评论 19 139
  • adb发送广播 adb shell am broadcast -a action的名字,即配置文件中action的...
    nicoleandlili阅读 14,983评论 0 3
  • 金圣叹,死后其名得以扬天下。后有谤者,有誉者,谤者谓之大邪,誉者谓之大才。今我读之,有感如下: 史料记载(钱谦益的...
    长了翅膀的猫阅读 3,998评论 0 0

友情链接更多精彩内容