安卓学习笔记六(广播接收者创建、静态注册、动态注册、发送自定义广播信息)

目录

一、怎么设置广播接收者?
二、收到广播后怎么办?
三、怎么设置和发送广播信息?

在Android系统中,广播是一种运用在组件之间传递消息的机制,例如电池过低时会发送一条提示广播。那么我们如何去接收这条信息呢?如果要接收并过滤广播中的消息,我们就需要用到BroadcastReceiver(广播接收者),在安卓学习笔记一种我们提过Activity、Service、ContentProvider、BroadcastReceiver是四大组件,通过广播接收者可以监听系统中的广播消息,实现不同组件之间的通信。
1、广播是不同组件间进行通信的一种机制,广播可分为无序广播和有序广播
2、一个“活的”接收者接收特定的广播消息并作出回应,主要由intent-filter,action来实现,是不是觉得似曾相识呢?我们在隐式intent的时候也用到过
3、receiver在AndroidManifest.xml中以标签显示
4、receiver可以被activity或者service注册
5、receiver有onReceive()回调方法
可能你在看到这儿的时候有很多的问号,那么请带着疑问接着看下去,你会找到答案的

一、怎么设置广播接收者?

如我们文章开头提到的系统发出一条电池电量过低的广播消息,那我们要怎么样才能接收到这条信息呢?就好比《爱情公寓》里曾小贤主持的电台,我们怎么样才能接收到这个节目呢?就是要把我们的收音机调到对应的频道上。
同理,我们也需要把广播接收者注册一下,相当于“我们订阅了这个频道”,这样我们就可以接收到“这个频道的消息”了。以接收系统广播“电量过低”为例:
1.动态注册
特点:

  • 动态注册是创建一个广播接收者,并在Activity中通过代码进行注册。
  • 动态注册的广播接收者是否被注销依赖于注册广播的组件,如果在MainActivity中注册,那么MainActivity被销毁时,广播接收者也随之被注销。
    如果我们要接收程序或者系统发出的广播消息,我们首先要创建一个广播接收者,我们可以在程序的包中创建一个Receiver3类继承自BroadcastReceiver,并重写onReceive()方法,这里Receiver3是我创建的广播接收者的名称,建好的文件中如下所示:
    (Receiver3.java):
package com.example.receivebroadcast;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class Receiver3 extends BroadcastReceiver {

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

创建广播接收者完成后,我们需要在MainActivity中注册广播接收者Receiver3
(MainActivity.java):

ackage com.example.receivebroadcast;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {
    private Receiver3 receiver3;
    private IntentFilter filter3;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
        receiver3 = new Receiver3();//实例化广播接收者Receiver3
        filter3 = new IntentFilter("android.intent.action.BATTERY_LOW");//实例化过滤器并设置要过滤的广播
        registerReceiver(receiver3,filter3);//注册广播
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(receiver3);//当MainActivity销毁时注销广播
    }
}

这里我们要注意的几点:
①receiver3 = new Receiver3();//实例化广播接收者Receiver3
② filter3 = new IntentFilter(“android.intent.action.BATTERY_LOW”)//实例化过滤器并设置要过滤的广播
这是将几句语句合并后的样子,拆分开来我们可以按下面这样三句来写,两者是等价的

String action = "android.intent.action.BATTERY_LOW";//设置action
filter3 = new IntentFilter();
filter3.addAction(action);//隐式意图intent是setAction(),注意区分

③registerReceiver(receiver3,filter3);//注册广播
第一个参数表示广播接收者,第二个参数表示实例化的过滤器。
④unregisterReceiver(receiver3);//当MainActivity销毁时注销广播
这里我们重写了onDestroy()方法,在该方法中通过unregisterReceiver()方法注销广播接收者。
我们在onCreate()方法中注册了广播接收者,我们就要相应地在onDestroy()方法中注销广播接收者,这两者“配套”的。当然你在onStart()方法中注册时,那相应地在onStop()方法中注销。
2.静态注册
特点:

  • 静态注册是创建一个广播接收者,并在清单文件中完成注册。
  • 静态注册无论应用程序是否处于运行状态,广播接收者都会对程序进行监听
    静态注册广播接收者时,首先创建广播接收者,选中BroadcastReceiver应用程序的包,右击选择【new】→【other】→【Broadcast Receiver】
    安卓学习笔记六(广播接收者创建、静态注册、动态注册、发送自定义广播信息)_第1张图片
    Class Name:表示要创建广播接收者名称
    Exported:表示是否接受当前程序之外的广播
    Enabled:表示广播接收者是否可以由系统实例化
    Source Language:表示编写源码所用的语言
    点击Finish,创建广播接收者完成,Android Studio工具会自动在AndroidManifest.xml文件中注册广播接收者,我们可以看到它是标签展示的
    安卓学习笔记六(广播接收者创建、静态注册、动态注册、发送自定义广播信息)_第2张图片
    注意:在Android8.0后,使用静态注册的广播接收者将无法接收到广播

二、收到广播后怎么办?

我们已经创建好了广播接收者并且已经注册了,我们可以接收到广播消息了,但是我们收到广播后要怎么办呢?这个“怎么办”就是在Receiver3类中的onReceive()方法中实现了。
安卓学习笔记六(广播接收者创建、静态注册、动态注册、发送自定义广播信息)_第3张图片
我们可以看到未经处理的onReceive()方法默认抛出了一个未支持操作异常UnsupportedOperationException,正在后续程序中实现onReceive()方法时,删除该异常或者注释掉这句语句即可。
我们接收到了系统广播消息“电池电量过低”,我们想在日志里打印出这个消息,我们可以重写onReceive()方法
(Receiver3.java):

package com.example.receivebroadcast;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class Receiver3 extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i("Receiver","Receiver3 received broadcast:电池电量低");
    }
}

注意的点:
①重写onReceive()方法,接收到广播消息后的操作在这里完成

三、怎么设置和发送广播信息

我们可以接收系统的广播信息,那么我们可不可以自己设置和发送广播信息呢?即自定义广播。答案当然是肯定的。
广播分为无序广播和有序广播

  • 无序广播
    ①无序广播完全是异步执行的,发送广播时,所有监听这个广播的广播接收都会接收到这个广播,但是接收和执行的顺序不确定。
    ②无序广播的效率比较高,但是无法被拦截

  • 有序广播
    ①有序广播时按照广播接收者声明的优先级别被依次接收,发送广播时,只有一个广播能接收到这个消息,当在此广播接收者中逻辑执行完后,广播才会继续传递。当优先级相同时,先注册的广播接收者的优先级高
    ②有序广播效率低,但此类型是由先后顺序的,并且可以被拦截
    创建一个广播消息,发送内容为“这是一条自定义消息”
    ( MainActivity.java):

package com.example.receivebroadcast;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    private Button btn1;
    private Receiver1 receiver1;//广播接收者receiver1
    private Receiver2 receiver2;//广播接收者receiver2
    
    private IntentFilter filter1;//广播过滤器filter1
    private IntentFilter filter2;//广播过滤器filter2
  
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn1= findViewById(R.id.btn1);
        btn1.setOnClickListener(this);

        receiver1 = new Receiver1();
        filter1 = new IntentFilter("MyBroadcast");//广播过滤器的action为MyBroadcast,与发送的广播信息的action要一致
        registerReceiver(receiver1,filter1);//注册广播接收者,第一个参数为广播接收者,第二个参数为实例化的过滤器

        receiver2 = new Receiver2();
        filter2 = new IntentFilter("MyBroadcast");
        registerReceiver(receiver2,filter2);
    }

    @Override
    public void onClick(View v) {
        switch(v.getId()){//点击按钮来发送广播信息
            case R.id.btn1:
               Intent intent = new Intent();
                intent.setAction("MyBroadcast");//设置广播信息的action为MyBroadcast
                intent.putExtra("content","这是一条自定义广播消息");//设置广播信息的内容为“这是一条自定义广播消息”
                sendOrderedBroadcast(intent,null);//发送有序广播,第一个参数是intent,第二个参数表示收到广播的权限信息,null表示可以被所有广播接受者接受
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(receiver1);
        unregisterReceiver(receiver2);
    }
}

然后我们在广播接收者Receiver1和Receiver2接受到广播信息后要在日志中打印出接受到的广播信息“这是一条自定义消息”
(Receiver1.java):

public class Receiver1 extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO: This method is called when the BroadcastReceiver is receiving
        // an Intent broadcast.
        //throw new UnsupportedOperationException("Not yet implemented");
        Log.i("Receiver","Receiver1 received broadcast:"+intent.getStringExtra("content"));//在日志中打印出接收到的广播消息
    }
}

Receiver2同理可得

你可能感兴趣的:(Android)