`
he91_com
  • 浏览: 400991 次
文章分类
社区版块
存档分类
最新评论

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~
分享到:
评论

相关推荐

    Android 四大组件之BroadcastReceiver

    在Android系统中,四大组件是应用程序的核心组成部分,包括Activity、Service、Content Provider和BroadcastReceiver。本篇文章将聚焦于BroadcastReceiver,讲解如何在Android应用中使用它,特别是静态注册和动态...

    Android四大组件之BroadcastReceiver详解

    Android四大组件之BroadcastReceiver详解 在 Android 开发中,BroadcastReceiver 是四大组件之一,扮演着监听和响应应用发出的广播消息的角色。今天,我们将深入探讨 BroadcastReceiver 的作用、实现原理、注册方式...

    Android核心基础-9.Android四大组件之BroadcastReceiver-附件资源

    Android核心基础-9.Android四大组件之BroadcastReceiver-附件资源

    Android四大组件——BroadcastReceiver普通广播、有序广播、拦截广播、本地广播、Sticky广播、系统广播

    以下是对Android四大组件中的BroadcastReceiver的详细解析: 1. **普通广播(Normal Broadcast)** 普通广播是最常见的广播类型,它允许同时有多个BroadcastReceiver接收到同一条广播Intent。一旦广播被发送,所有...

    Android四大组件简述

    在"Android四大组件简述"这个项目中,你可以找到关于这些组件的示例代码和实践应用,通过学习和调试这些示例,可以更深入地理解四大组件的工作原理和使用方式。这将对提升你的Android开发技能大有裨益。

    11.四大组件之BroadcastReceiver.pptx

    BroadcastReceiver是Android系统四大组件之一,它主要用于在应用程序的不同组件或者不同应用程序之间进行异步通信。在Android系统中,BroadcastReceiver扮演着消息分发者的角色,它可以接收并响应系统或应用自行发送...

    android四大组件详解

    在Android系统中,四大组件是构建应用程序的核心元素,它们分别是Activity、Service、BroadcastReceiver和Content Provider。这四个组件各自承担着不同的职责,共同构成了Android应用的骨架。 **Activity**是用户与...

Global site tag (gtag.js) - Google Analytics