四大组件之广播接收器BroadcastReceiver

概念引入:

 广播(Broadcast)是一种广泛运用的在应用程序之间传输信息的机制,在 Android 里面有各种各样的广播,比如电池的使用状态,类似于当手机锁屏解锁、收到短信电话、电量过低提示,应用程序也可以接受广播并做出程序逻辑上的处理, 去实现我们给用户的一些提示或者其他的一些操作,这都是通过广播监听系统动作锁实现的

(1)你的应用可以使用它对外部事件进行过滤,只对感兴趣的外部事件(如当电话呼入时,或者数据网络可用时)进行接收并做出响应。广播接收器没有用户界面。然而,它们可以启动一个activity或serice来响应它们收到的信息,或者用NotificationManager来通知用户。通知可以用很多种方式来吸引用户的注意力,例如闪动背灯、震动、播放声音等。一般来说是在状态栏上放一个持久的图标,用户可以打开它并获取消息。
(2)广播接收者的注册有两种方法,分别是程序动态注册和AndroidManifest文件中进行静态注册。
(3)动态注册广播接收器特点是当用来注册的Activity关掉后,广播也就失效了。静态注册无需担忧广播接收器是否被关闭,只要设备是开启状态,广播接收器也是打开着的。


Android中的广播接收器分为两种类型:标准广播、有序广播

标准广播(Normal broadcasts):是一种完全异步执行的广播,在广播发出以后,所有的广播接收器几乎都会在同一时刻收到这一条广播消息,因此它们之间没有任何先后顺序可言。这种广播效率比较高,但通知也意味着它时无法被截断的。

工作流程
这里写图片描述

有序广播(Ordered broadcasts):则是一种同步执行的广播,在广播发出之后,同一时刻只会有一个广播接收器能够收到这条广播消息,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递。所以此时的广播接收器是有先后顺序的,优先级高的广播接收器就可以先收到这条广播,并且前面的广播接收器还可以阶段正在传递的广播,这样后面的广播接收器就无法收到这条广播消息了。
这里写图片描述

广播的注册方式:

广播接收器的(构建)注册广播方式有两种:在代码中注册(动态注册)、在AndroidManifest.xml中注册(静态注册)

动态注册:广播的接收者需要通过调用registerReceiver函数告诉系统,它对什么样的广播有兴趣,即指定IntentFilter,并且向系统注册广播接收器,即指定BroadcastReceiver:

IntentFilter counterActionFilter = new IntentFilter(CounterService.BROADCAST_COUNTER_ACTION);
registerReceiver(counterActionReceiver, counterActionFilter); 

第一个参数是继承了BroadcastReceiver的类的实例对象
第二个参数是指定想要实现的动作(广播接收器想要监听什么广播,就在第二个参数中实现相应的action就可以了)

静态注册:

<receiver  android:name = ".接收广播的类名">
    //并且在里面添加
    <intent-filter>
          <action android:name="要接收的广播"/>
    </intent-filter>
</receiver>

切记:动态注册的广播接收器一定都要取消注册才可以,可以在onDestroy()方法中通过调用unregisterReceiver()方法来实现

//解除注册
public void onDestory(){
    unregisterReceiver(counterActionReceiver);
}

广播的发送

发送标准广播:用sendBroadcast(intent)方法
因为已经确定了要接收的广播,所以一个类中需要实现广播的发送,并且要发送的广播为之前所接收的广播
发送有序广播:有序广播类似于中央发红头文件,一级一级的传播,中间可以被截断,截断以后,后面的广播接收器将收不到这条广播
发送有序广播和之前发送标准广播的区别不是很大,只需要将最后sendBroadcast(intent);方法改变成sendOrderedBroadcast(intent,null);

button.setOnClickListener(new OnClickListener(){

            @Override
            public void onClick(View v) {
                //标准广播
                Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
                sendBroadcast(intent);


                //有序广播
                Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
                 sendOrderedBroadcast(intent, null); 

                 //发送本地广播
                Intent intent = new Intent("com.example.broadcasttest.LOCAL_BROADCAST");
                localBroadcastManager.sendBroadcast(intent);
            }
        });

###本地广播的使用
前面所介绍的发送和接收的广播全部是属于系统全局广播,即发出的广播可以被其他任何的任何应用程序收到,并且也可以接受到来自其他应用程序的广播。这样容易有安全问题,所以引入本地广播

使用本地广播只需要在代码中动态注册,通过本地广播管理器(LocalBroadcastManager)的对象调用registerReceiver()方法动态的去注册,然后记得必须在onDestroy()方法中取消注册

package com.example.boradcasttest;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.support.v4.content.LocalBroadcastManager;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {
    private IntentFilter intentFilter;
    private LocalReceiver localReceiver;
    private LocalBroadcastManager localBroadcastManager;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //获取实例
        localBroadcastManager = LocalBroadcastManager.getInstance(this);

        Button button = (Button)findViewById(R.id.button);
        button.setOnClickListener(new OnClickListener(){

            @Override
            public void onClick(View v) {
                 //发送本地广播
                Intent intent = new Intent("com.example.broadcasttest.LOCAL_BROADCAST");
                localBroadcastManager.sendBroadcast(intent);
            }
        });
        //动态注册广播接收器,切记要解除注册
        intentFilter = new IntentFilter();
        intentFilter.addAction("com.example.broadcasttest.LOCAL_BROADCAST");
        localReceiver = new LocalReceiver();
        localBroadcastManager.registerReceiver(localReceiver, intentFilter);
    }
    @Override
        /*
        因为在前面通过LocalBroadcastManager对象调用registerReceiver()方法
         进行了动态的注册,所以在覆写onDestroty()方法中需要取消注册
         */

    protected void onDestroy() {
        super.onDestroy();
        localBroadcastManager.unregisterReceiver(localReceiver);
    }

    //自定义的本地广播接收器
    class LocalReceiver extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(context, "本地接收到广播", Toast.LENGTH_SHORT).show();
        }

    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章