• Android学习总结(六)———— 发送自定义广播


    一.两种广播类型

    2.1 标准广播

      是一种完全异步执行的广播,在广播发出去之后,所有的广播接收器几乎都会在同一时刻接收到这条广播消息,因此它们之间没有任何先后顺序可言。这种广播的效率会比较高,但同时也意味着它是无法截断的。

    2.2 有序广播

      是一种同步执行的广播,在广播发出之后,同一时刻只会有一个广播接收器能够收到这条广播消息,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递,所有此时的广播接收器是有先后顺序的,优先级高的广播接收器就可以先收到广播消息了,并且前面的广播接收器还可以截断正在传递的广播,这样后面的广播接收器就无法收到广播消息了。

    二.示例代码

    2.1、发送标准广播

      新建一个MyBroadcastReceiver继承自BroadcastReceiver,代码如下所示:

    package com.nyl.custombroadcast;
    
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.widget.Toast;
    
    public class MyBroadcastReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(context,"收到广播接收器",Toast.LENGTH_SHORT).show();
        }
    }

      然后AndroidManifest.xml中注册下,写上Intent-filter:

      

      定义一个简单的按钮,用于作为发送广播的触发点,然后在MainActivity中完成发送按钮,代码如下所示:

    package com.nyl.custombroadcast;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    
    public class MainActivity extends Activity implements View.OnClickListener {
    
        private Button btnSendBroadcast;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            btnSendBroadcast = (Button) findViewById(R.id.btnSendBroadcast);
            btnSendBroadcast.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View view) {
            /**
             * 构建出一个Intent对象,并把要发送的广播的值传入,然后调用了Context的sendBroadcast()方法将广播发送出去
             * 这样所有监听com.nyl.custombroadcast.MyBroadcastReceiver这条广播的广播接收器就会收到消息。
             */
            Intent intent = new Intent("com.nyl.custombroadcast.MyBroadcastReceiver");
            sendBroadcast(intent);
        }
    }

      运行程序,点击一下发送广播按钮,效果如下图:

      

      这样我们就成功完成了发送自定义广播的功能了。

    2.2、发送有序广播

      接收者通过Bundle bundle = new getResultExtras(true)可以获取上一个接收者存入的数据,定义了两个AnotherBroadcastReceiver类,如下所示:

    package com.nyl.orderlybroadcast;
    
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.os.Bundle;
    import android.widget.Toast;
    
    
    public class AnotherBroadcastReceiver extends BroadcastReceiver{
        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(context,"收到广播接收器",Toast.LENGTH_SHORT).show();
            //创建一个Bundle对象,并存入数据
            Bundle bundle = new Bundle();
            bundle.putString("first","有序广播");
            //将bundle放入结果中
            setResultExtras(bundle);
            //取消Broadcast的继续发送,也就是将广播截断,不再发给下一个广播接收器 
            abortBroadcast();
        }
    }
    package com.nyl.orderlybroadcast;
    
    
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.os.Bundle;
    import android.widget.Toast;
    
    public class AnotherBroadcastReceiver1 extends BroadcastReceiver{
        @Override
        public void onReceive(Context context, Intent intent) {
            Bundle bundle = getResultExtras(true);
            //解析前一个BroadcastReceiver所存入的key为first的消息
            String first = bundle.getString("first");
            Toast.makeText(context,"第一个广播存入的消息为:" + first,Toast.LENGTH_SHORT).show();
        }
    }

      在AndroidManifest.xml中对该AnotherBroadcastReceiver行注册,添加开机广播的intent-filter,然后android:priority属性给广播接收器设置了优先级,优先级比较高的广播接收器就可以先收到广播。如下图所示:

      

       还是跟发送标准的一样,定义一个简单的按钮,用于作为发送广播的触发点,然后在MainActivity中完成发送按钮,代码如下所示:

    package com.nyl.orderlybroadcast;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    
    public class MainActivity extends Activity implements View.OnClickListener {
    
        private Button btnOrderlyBroadcast;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            btnOrderlyBroadcast = (Button) findViewById(R.id.btnOrderlyBroadcast);
            btnOrderlyBroadcast.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View view) {
            Intent intent = new Intent("com.nyl.orderlybroadcast.AnotherBroadcastReceiver");
            /**
             * sendOrderedBroadcast()方法接收两个参数:第一个参数是intent
             * 第二个是一个与权限相关的字符串,这里传入null就行了
             */
            sendOrderedBroadcast(intent,null);
        }
    }

      注:如果把AnotherBroadcastReceiver的abortBroadcast()这个方法注释掉,那么AnotherBroadcastReceiver1也会收到广播,按照配置的接收优先级顺序,AnotherBroadcastReceiver会先接收到,然后才到AnotherBroadcastReceiver1,效果如下图:     

           

      关于广播的内容介绍就这么多,内容有写得不对的地方,欢迎广大园友指正!

  • 相关阅读:
    删除docker thin 空间解决文件满不能拉起docker问题
    kafka服务端和客户端均无法消费
    prometheus 配置支持consul动态拉取
    spring cloud consul配置
    使用arthas分析慢查询
    nginx日志格式配置
    spring secrity添加和去掉x-frame-options deny安全头
    java POI解析word为文本内容
    sublime text 3 插入当前时间
    CUnit 安装笔记
  • 原文地址:https://www.cnblogs.com/nylcy/p/6507246.html
Copyright © 2020-2023  润新知