• Android四大组件之Broadcast(学习笔记)


    BroadcastReceiver
    发送,把信息装入到一个Intent对象
    通过调用相应的方法将Intent对象以广播的方式发送出去
    sendBroadcast();
    sendOrderBroadcast();
    sendStickyBroadCast();
    service只有10s所以不能使用子线程

    使用BroadcastReceiver的方法:
    发送:
    首先在需要发送信息的地方,把要发送的信息和用于过滤的信息(如Action,Category)装入一个Intent对象,然后通过调用Context.sendBrocast(),sendOrderBroadcast()或者sendStickyBroadcast()方法,把Intent对象以广播的方式发送出去。
    接受:
    当Intent发送之后,所有已经注册的BroadcastReceiver会检查注册时的IntentFilter是否与发送的Intent相匹配,若匹配则会调用BroadcastReceiver的onReceive()方法。所以当我们定义一个BroadcastReceiver的时候,都需要实现onReceive()方法

    BroadcastReceiver的静态注册,在Mainifest中注册

    <receiver 
                android:name=".BC2">
                 <intent-filter>
                    <action
                        android:name="BC_ONE">
                    </action>
                 </intent-filter>
     </receiver>
    BroadcastReceiver所对应的广播分两类:
    普通广播和有序广播。
    普通广播:通过Context.sendBroadcast()方法来发送,它是完全异步的。
    所有的receivers(接收器)的执行顺序不确定,因此所有的receivers(接收器)接收broadcast的顺序不确定。
    这种方式效率更高,但是BroadcastReceiver无法使用setResult系列、getResult系列及abort(中止)系列API
    在有序广播中可以阻断广播
    优先接收到Broadcast的接收者可以通过setResultExtras(Bundle)方法将处理结果存入Broadcast中,
    然后传给下一个接收者,
    下一个接收者通过Bundle bundle = new getResultExtras(true)可
    以获取上一个接收者存入的数据
    可以设置优先级确定哪个Broadcast首先收到广播

    MainActivity中的代码
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            /*
            * Broadcast的动态注册
            * */
            IntentFilter intentFilter=new IntentFilter("BC_ONE");//action
            BC1 bc1=new BC1();
            registerReceiver(bc1,intentFilter);
        }
        //设定点击事件
        public void on_Click(View view){
            switch (view.getId()){
                case R.id.button:
                    /*在intent中放入所要传播的信息,putExtra,放入一个Map类的数据
                    * 通过getExtra得到所放入的信息
                    * 通过在Intent中放入action中,传播广播
                    * */
                    Intent intent=new Intent();
                    intent.putExtra("msg","这是一个普通的广播");
                    intent.setAction("BC_ONE");
                    sendBroadcast(intent);
                    break;
                case R.id.button2:
                    Intent intent2=new Intent();
                    intent2.putExtra("msg","这是一个有序的广播");
                    intent2.setAction("BC_ONE");
                    //设置有序广播
                    sendOrderedBroadcast(intent2,null);
                default:
                    break;
            }
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
    
        }
    }

    第一个BroadcastReceiver

    public class BC1 extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            BC1 bc1=new BC1();
            String s=intent.getStringExtra("msg");
            System.out.println("输出数据1"+s);
            /*在有序广播中可以阻断广播
            * 优先接收到Broadcast的接收者可以通过setResultExtras(Bundle)方法将处理结果存入Broadcast中,
            * 然后传给下一个接收者,
            * 下一个接收者通过Bundle bundle = new getResultExtras(true)可
            * 以获取上一个接收者存入的数据
            * 可以设置优先级确定哪个Broadcast首先收到广播
            * */
    //        abortBroadcast();
            Bundle bundle=new Bundle();
            bundle.putString("test","广播处理的数据");
            setResultExtras(bundle);
        }
    }

    第二个BroadcastReceiver

    public class BC2 extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            String s=intent.getStringExtra("msg");
            System.out.println("输出数据2"+s);
            Bundle bundle=getResultExtras(true);
            String s1=bundle.getString("test");
            System.out.println("得到的处理结果是"+s1);
        }
    }

    BC1的注册是动态注册,一般来说动态注册的接收广播要早于静态注册的,在收到有序广播后可以进行修改或者阻拦,通过setResultExtras放入bundle数据,在要接收广播的下个

    BroadcastReceiver中设置getResultExtras是否为true,为true的话就接收bundle数据。

  • 相关阅读:
    服务端获取实际IP工具类
    vue-element-admin整合服务端代理api
    elemengui分页
    vue获取浏览器地址栏参数
    el-table-column动态判断显示性别男女
    nginx代理静态页面添加二级目录
    nginx配置代理指向Redis
    SpringBoot整合Redis日志反复提示Redis重连问题
    centos7安装Redis
    nohup启动jar包
  • 原文地址:https://www.cnblogs.com/edwardru/p/6007032.html
Copyright © 2020-2023  润新知