• Android 四大组件之 BroadcastReceiver


    0  简介

           BroadcastReceiver也就是“广播接收者”的意思,顾名思义,它就是用来接收来自系统和应用中的
    广播。
           在Android系统中,广播体现在方方面面,例如当开机完成后系统会产生一条广播,接收到这条广播
    就能实现开机启动服务的功能;当网络状态改变时系统会产生一条广播,接收到这条广播就能及时地做出提
    示和保存数据等操作;当电池电量改变时,系统会产生一条广播,接收到这条广播就能在电量低时告知用户
    及时保存进度,等等。
           Android中的广播机制设计的非常出色,很多事情原本需要开发者亲自操作的,现在只需等待广播告
    知自己就可以了,大大减少了开发的工作量和开发周期。

    1  普通广播

           普通广播对于多个接收者来说是完全异步的,通常每个接收者都无需等待即可以接收到广播,接收者相互之
    间不会有影响。对于这种广播,接收者无法终止广播,即无法阻止其他接收者的接收动作。
    动态接收器高优先级 > 动态接收器低优先级 > 静态接收器高优先级 > 静态接收器低优先级
     

        1.1 自定义广播 MyReceiver.java

    package com.broadcastreceiver;
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.widget.Toast;
    public class MyReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            // TODO 自动生成的方法存根
            Toast.makeText(context, intent.getAction()+intent.getStringExtra("message"), Toast.LENGTH_SHORT).show();
        }
    }


        1.2 注册广播

    <receiver android:name="com.broadcastreceiver.MyReceiver">
        <intent-filter >
            <action android:name="michael.FIRSTRECEIVER"/>
        </intent-filter>
    </receiver>

        1.3 发送广播

    package com.broadcastreceiver;
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    public class MainActivity extends Activity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            Button btn_send=(Button)findViewById(R.id.btn_send);
            btn_send.setOnClickListener(new OnClickListener() {
                
                @Override
                public void onClick(View v) {
                    Intent intent=new Intent();
                    intent.setAction("michael.FIRSTRECEIVER");
                    intent.putExtra("message", "我是神奇的广播消息!");
                    sendBroadcast(intent);
                }
            });
        }
    }


    2  有序广播

           有序广播比较特殊,它每次只发送到优先级较高的接收者那里,然后由优先级高的接受者再传播到优先级低
    的接收者那里,优先级高的接收者有能力终止这个广播
    如果静态接收器的优先级高于动态接收器的优先级,那么还是静态接收器先接收到广播(比如接收短信)
     

        2.1 在前一节的基础上再新建个 广播 YourReceiver.java

    package com.broadcastreceiver;
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.os.Bundle;
    import android.widget.Toast;
    public class YourReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            Bundle bundle=getResultExtras(true);
            String first=bundle.getString("first");
            Toast.makeText(context, "上一个接收器转播的数据为:"+first, Toast.LENGTH_LONG).show();
        }
    }


        2.2 代码注册广播

    package com.broadcastreceiver;
    import android.app.Activity;
    import android.content.Intent;
    import android.content.IntentFilter;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    public class MainActivity extends Activity {
        YourReceiver yourreceiver=null;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            yourreceiver=new YourReceiver();
            Button btn_send=(Button)findViewById(R.id.btn_send);
            btn_send.setOnClickListener(new OnClickListener() {
                
                @Override
                public void onClick(View v) {
                    Intent intent=new Intent();
                    intent.setAction("michael.FIRSTRECEIVER");
                    intent.putExtra("message", "我是神奇的广播消息!");
                    sendBroadcast(intent);
                }
            });
            
            //代码动态注册广播
            IntentFilter filter=new IntentFilter();
            filter.addAction("michael.FIRSTRECEIVER");
            filter.setPriority(10);
            registerReceiver(yourreceiver, filter);
        }
        @Override
        protected void onDestroy() {
            //程序退出前取消注册广播
            unregisterReceiver(yourreceiver);
            super.onDestroy();
        }
    }

    广播的发送不局限于当前应用程序,其它程序发送广播的话也可接收到。

    2.3  接收优先级

           静态接收器优先级低于动态接收器,也就是说,无论多么高级别的静态接收器和多么低级别的动态接收器都
    接收同一广播,永远都是动态接收器先接收到(相对于普通广播)
           动态接收器也可以设置优先级,高优先级的接收器会在低优先级的接收器之前接收到广播,同样优先级的动
    态接收器,谁先注册到系统,谁就抢先接收到广播。
     
    举例:
    假设有如下优先级的5个接收器
    1.动态A(优先级=1)
    2.动态B(优先级=2)
    3.动态C(优先级=2)
    4.静态D(优先级=1)
    5.静态E(优先级=2)并且B先于C注册
     
    普通广播接收的顺序
    B C A E D    (动态接收器高优先级 > 动态接收器低优先级 > 静态接收器高优先级 > 静态接收器低优先级 )
    有序广播接收的顺序
    B C E A D    (如果静态接收器的优先级高于动态接收器的优先级,那么还是静态接收器先接收到广播)
     
    这是在一片博客上看到的图,忘记原创地址了,罪过啊

     
     
     
     
     
     注:转载请注明出处 :)   毕竟代码是一个一个敲出来的啊,O(∩_∩)O~
     
     
     
     
     
     
     
  • 相关阅读:
    数据存储大小端验证
    Python之路【第二十三篇】爬虫
    Python之路【第二十篇】Tornado框架
    Python之路【第二十二篇】CMDB项目
    Python之路【第二十一篇】Django ORM详解
    Python之路【第二十篇】其他WEB框架
    Python之路【第十九篇】自定义分页实现(模块化)
    Python之路【第十八篇】Django小项目webQQ实现
    Python之路【第十八篇】Django小项目简单BBS论坛部分内容知识点
    Python之路【第十七篇】Django进阶篇
  • 原文地址:https://www.cnblogs.com/suncoolcat/p/3339574.html
Copyright © 2020-2023  润新知