美文网首页
Android基础知识——BroadCastReceive

Android基础知识——BroadCastReceive

作者: 银月银月 | 来源:发表于2018-06-04 10:24 被阅读4次

     本文参考了https://blog.csdn.net/qq_35578940/article/details/52445170

    BroadCastReceiver是Android四大组件之一,主要用于接收系统或者app发送的广播事件

          广播分两种: 有序广播和无序广播

          内部通信实现机制:通过Android系统的Binder机制实现通信的

    无序广播:sendBroadcast()方法发送的广播为无序广播,无序广播逻辑上可以被任何广播接受者接收到,优点是效率高。缺点是一个接收者不能将处理结果传递给下一个接收者,传递的数据在传输过程中不能被修改,并无法终止广播的传播。

    有序广播:sendOrderedBroadcast()方法发送的广播为有序广播,有序广播依次传播,列如有三个广播接收者A,B,C, 优先级是A>B>C,

          此时发送一条广播,那这个消息先传给A,再传给B, 最后传给C,每个接收者都有权终止广播,比如B终止广播,C就无法接受到,

          此外A接收到广播后可以对结果对象进行操作,当广播传给B时,B可以从结果对象中获取A存入的数据。

      在通过context.sendOrderedBroadcast(intent, receiverPermission, resultReceiver, scheduler,initialCode, initialData, initialExtras);时我们可以指定resultReceiver广播接收者,

    这个接收者我们可以认为是最终接收者,通常情况下如果比他优先级更高的接收者如果没有终止广播,那么他的onReceive方法会被执行两次,

    第一次是正常的按照优先级顺序执行,第二次是作为最终接收者接收,如果比他优先级高的接收者终止了广播,那么他依然能接收到广播。

    在我们的项目中经常使用广播接收者接收系统通知,比如开机启动,sd卡挂载,低电量,外拨电话,锁屏等等,

    如果我们做的是播放器,那么监听到用户锁屏后我们应该将我们的播放器暂停等。

    BroadcastReceiver有两种注册方法,在Androidmainfest中注册广播接收者称为静态注册,在代码中注册称为动态注册。

    静态注册的广播接收者只要app在系统中注册则可以一直接收到广播消息,动态注册的广播接收者当注册的activity或Service销毁了那么就接收不到广播了,

    所以一般应用都是静态注册的,有一些操作特别频繁的广播事件在Androidmainfest中注册无效的,

    如手机锁屏广播,在代码中我们可以用registerReceiver()方法去注册广播。

      需要注意的地方:

        1.BroadcastReceiver的生命周期是非常短暂的,在接收广播的时候创建,onReceiver()方法结束之后销毁

      2.  广播接收者中不要做一些耗时的工作,否则会弹出Application No Response(应用无响应anr)错误对话框,,一般耗时的较长的操作最好放在服务中完成。

    3.最好也不要在广播接收者中创建子线程做耗时操作,因为广播接收者被销毁后进程就成为空进程,而空进程很容易被系统杀掉。     

    Android中引入广播机制的用意 :

    1.程序间互通消息(例如在自己的应用程序内监听系统的来电)

    2.效率上(参考UDP的广播协议在局域网的方便性)

    3.设计模式上(反转控制的一种应用,类似监听者模式)

    发送和接收广播的小Demo;

    public class MainActivity extends Activity {  

    @Override  

    protected void onCreate(Bundle savedInstanceState) {  

    super.onCreate(savedInstanceState);  

            setContentView(R.layout.activity_main);  

        }  

    //点击按钮发送一条无序 广播   

    public void click(View v) {  

    Intent intent =new Intent();  

    //设置发送广播的事件  

    intent.setAction("com.itcast.customreceiver");  

    intent.putExtra("name", "每天晚上7点准时开整~~");  

    //发送广播  

            sendBroadcast(intent);  

        }  

    }  

     BroadcastReceiver {  

    //这个方法接收我们自定义发送的广播   

    @Override  

    public void onReceive(Context context, Intent intent) {  

    //终止广播  

            abortBroadcast();  

    String name = intent.getStringExtra("name");  

    Toast.makeText(context, name,0).show();  

        }  

    }  

    相关文章

      网友评论

          本文标题:Android基础知识——BroadCastReceive

          本文链接:https://www.haomeiwen.com/subject/wusesftx.html