Android四大组件之一 ——广播

一, 我们所熟知的广播是指通过无线电波或导线传送声音的新闻传播工具。通过无线电波传送节目的称无线广播,通过导线传送节目的称有线广播。

在我们生活中这样的例子有很多,例如,老师站在前面讲话的时候说下课了,就相当于发送了一个广播,当学生们做出相应的动作,有的收拾书包,有的拿着饭卡就跑了对吧,学生们就是广播的接受器。

在Android中广播,我们能做到的是在特定的时刻发送一条广播,所有对应的广播接收器都可以做出相应的操作,从实现原理上可以看,android中的广播使用了观察者模式,基于消息的发布/订阅事件模型,因此,android中的广播将广播的发送者与接收者极大程度的解耦,使得系统能够方便集成,更易扩展。

二,广播的应用场景:
1.同一app内部的同一组件的消息通信(单个或多个线程之间)
2.同一app内部的不同组件的消息通信(单个进程)
3.同一app内部具有多个进程的不同组件的消息通信
4.不同app之间的组件之间消息通信
5.android系统在特定情况下与app之间的消息通信

三,广播分为有序广播和无序广播:
接着刚才的例子,就是老师宣布下课(即发广播)之后,学生们作为广播接收器,他们是同时下课的,因为他们接受到的广播是在同一时间发生的,因此,这一类的广播称为无序广播,

有序广播,就类似与击鼓传花游戏,喝酒敲7的游戏,当第一个人开始后,就相当于发了广播,下一个人作为广播接收器,依次向下传递。但规则只能是前一位做完游戏后,后一位才可以做游戏,因此这样的一类广播我们称之为有序广播。但值得注意的地方是广播接收器是可以截断有序广播的,一旦截断之后,后面的广播接收器就无法再被执行,就相当于上面玩游戏,第一个人向第二个人传递的时候,还没传给第三个人的时候,这个时候第三个人接了第一个人传递的,这就导致了这个游戏失败了,就得开始,因此第三个人以后的人再刚才的这场游戏中,无法继续玩游戏了。

四,广播作为四大组件之一,还需要对BroadcastRecevier进行注册。
注册又分为静态注册和动态注册:
1.静态注册:
类似于Activity,自定义一个广播接收器之后,在清单文件(AndroidManifest.xml)中注册即为静态注册。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.administrator.myapplication">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <receiver android:name=".MainActivity$MyBroadcast">
            <intent-filter>
                <action android:name="com.example.administrator.myapplication.MYBROADCAST"/>
            </intent-filter>
        </receiver>
    </application>

</manifest>

action就类似于显示生活中的广播的频段,当广播发送的时候需要制定后面的字符串,接收器接受的时候,也会根据该处的制定的字符串进行过滤,通常命名规范为项目的包命加上自定义的名字。

2.动态注册:
动态注册就是在java代码中进行注册BroadcastReceiver,也就是说只有在程序启动后,执行到注册代码才会注册成功,并且动态注册的广播需要解除注册才可以,

public class MainActivity extends AppCompatActivity {

    private static final String My_ACTION = "com.example.administrator.broadcastdemo.MYBROADCAST";
    private MyBroad myBroad;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始化广播接收器对象
        myBroad = new MyBroad();
        //初始化过滤器,对应清单文件中receiver中的字段
        IntentFilter intentFilter = new IntentFilter();
        //在过滤器中添加action
        intentFilter.addAction(My_ACTION);
        //注册广播
        registerReceiver(myBroad,intentFilter);
    }

    class MyBroad extends BroadcastReceiver{
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.d("MyBroad", "接收到广播");
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //取消动态注册的广播
       unregisterReceiver(myBroad);
    }
}

静态注册与动态注册的区别:
①静态注册:在android的清单文件中注册,在程序未执行的时候就已经注册成功了。例如手机在开机之后会发送一个系统的广播,我们可以根据此广播做到开机启动应用程序。
②动态注册:在java代码中进行注册,也就是程序执行到注册代码之后,才能注册成功,并且动态注册的广播接收器需要在特定的时刻取消注册,一般在生命周期的onDestroy()方法中。

五,现在我们来学习一下自定义广播。
1.发送无序的广播:
通过Context的sendBroadCast(Intent intent)方法发送无序广播,它是完全异步的。所有receivers(广播接受器)的执行顺序是不确定的。

public class MainActivity extends AppCompatActivity {

    private Button btn;
    private String MyAction = "com.example.administrator.myapplication.MYBROADCAST";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn = (Button) findViewById(R.id.btn);
        final Intent intent = new Intent(MyAction);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               //发送无序广播
                sendBroadcast(intent);
            }
        });
    }

其中的action是我们自定义的,那我们发送个自定义的广播,我们可以看到,广播是通过Intent进行发送的,intent是连接Android组件的枢纽。

2.发送有序广播:
通过Context.sendOrderedBroadcast()来发送,所有的recevier(广播接收器)依次执行,Receiver可以使用setResult()方法来把结果传给下一个Receiver,通过getResult()方法来取得上个Receiver的返回结果,并可以以abort()方法来让系统丢弃该广播,使得改广播不再传送到下一个Receiver。Receiver可以设置优先级属性,来决定Receiver的执行顺序。

public class MainActivity extends AppCompatActivity {

    private Button btn;
    private String MyAction = "com.example.administrator.myapplication.MYBROADCAST";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn = (Button) findViewById(R.id.btn);
        final Intent intent = new Intent(MyAction);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               //发送有序的广播
                sendOrderedBroadcast(intent,null); 
            }
        });
    }

六,广播接收器(BroadcastReceiver)
广播接受器就是我们平时所说的Android四大组件之一的广播,BroadcastReceiver是一个抽象类,因此我们可以自定义一个类来继承BroadRecevier,并实现它的抽象方法。
// 自定义的类继承BroadcastReceiver,并实现抽象方法

 public class MyBroadCast extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        Log.d("todo", "接受到了广播");
     }
 }

BroadcastRecevier的方法:
abortBroadcast() : 中止有序广播
getResultData() : 获取广播接收者之间传递的数据对象
getResultCode() :获取广播结束者之间传递的code
getResultExtras() :获取广播接收者之间传递的Bundle
setResultData(String data) :向下传递数据
setResultCode() :向下传递code
setResult(int code, String data, Bundle) :向下传递三个数据
setResultExtras(Bundle extras) :向下传递Bundle
isOrderedBroadcast() :判断是否是有序广播

广播得接收器:


public class MyBroad extends BroadcastReceiver{
     @Override
     public void onReceive(Context context, Intent intent) {
         Log.d("MyBroad", "接收到广播");
         //获取上一个Receiver中传递来的数据
         int code = getResultCode();//获取一种结果代码的初始值。通常为 Activity.RESULT_OK 。这个值是 -1 ;为其他 int 型 也可以,如 0,1,2 ;

         String data = getResultData();//获取广播数据
         Bundle args = getResultExtras(false);//获取广播的附加信息
         //向下一个Receiver传递数据,Bundle中可以携带需要的数据
         setResultCode(100);
         setResultData("Afanbaby");
         setResultExtras(args);
         //截断广播,不再向下进行传递
         abo     }
 }

七,接收系统的广播:
系统的广播通常是指Android系统执行的特定时刻,系统会发送特定的广播,以方便开发者获取一些数据或状态,只要涉及到手机的基本操作,基本上都会发出相应的系统广播,例如接收到短信,网络切换,系统开机的时候等等,每一个特定的广播都对应一个知己的特定action(也就是类似与频段)

下面是我列举的常用的系统广播:
android.intent.action.AIRPLANE_MODE 切换飞行模式时
android.intent.action.BATTERY_LOW 电池电量低时
android.intent.action.BATTERY_OKAY 电池由低到正常时
android.intent.action.BOOT_COMPLETED 系统开机成功之后
android.intent.action.PACKAGE_ADDED 成功的安装APK之后
android.intent.action.ACTION_POWER_CONNECTED 插上外部电源时发出的广播
android.net.conn.CONNECTIVITY_CHANGE 网络状态改变时
android.provider.Telephony.SMS_RECEIVED 接收短信

还有需要注意:某些广播的使用需要配合相应的系统权限,例如检查系统开机需要android.permission.RECEIVE_BOOT_COMPLETED权限;检查网络变化需要android.permission.ACCESS_NETWORK_STATE权限.

本人菜鸟一个,有什么不对得地方希望大家指出评论,大神勿喷,希望大家一起学习进步!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值