Android 四大组件 -- BroadcastReceiver(广播)

98 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

Android开发的四大组件分别是:
  • 活动(activity),用于表现功能;
  • 服务(service),后台运行服务,不提供界面呈现;
  • 广播接受者(BroadcastReceive),勇于接收广播;
  • 内容提供者(Content Provider),支持多个应用中存储和读取数据,相当于数据库

注意:所有的组件都需要注册

一、本文讲的是广播(BroadcastReceiver)

Android中的四大组件之一,是Android系统以及应用程序传递信号的一种机制。它灵活的穿梭在各个应用程序之间或者是单个应用程序的内部,一旦发现满足条件的接收者,就会去这个接收者中进行广播

点击参考官网

使用场景

  • 手机快没电了,弹出了提示电量不足的消息窗口
  • 逛淘宝的时候没信号,会弹出提示无法连接网络的提示信息
  • 电话来电的时候
二、广播的注册方式
  • 静态注册(清单声明的接收器)
  • 动态注册(上下文注册的接收器)
1、静态注册
  • 创建MyBroadcastReceiver类,继承BroadcastReceiver
public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,"静态广播------",Toast.LENGTH_SHORT).show();
    }
}

  • 在清单文件(AndroidManifest.xml)中注册
 <receiver android:name=".MyBroadcastReceiver" android:enabled="true" android:exported="true">
            <intent-filter>
                <action android:name="com.example.demoh.MyBroadcastReceiver"/>
            </intent-filter>
  </receiver>

Enabled属性的作用是是否启动这个广播接受器。 Exported属性的作用是是否允许这个广播接收器接受本程序以外的广播 android:name =" 里面的名字可随意(最好是统一包名+类名)"

在这里插入图片描述

  • 写一个发送广播的点击事件

  • activity_main.xml布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="点击发送静态广播" />
    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="点击发送动态广播" />

</LinearLayout>
  • MainActivity
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button=findViewById(R.id.button);
        //点击事件的处理
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent=new Intent();
                intent.setAction("com.example.demoh.MyBroadcastReceiver");
                //安卓8.0以上,加上下面这一句,第一个参数是目标广播接收器所在应用的包名,第二个参数是目标广播接收器类全路径
                intent.setComponent(new ComponentName(getPackageName(),getPackageName()+".MyBroadcastReceiver"));
                sendBroadcast(intent);
            }
        });
    }
}
`注意:如果点击无效果,不发送广播,或者您的应用以 API 级别 26(安卓8.0) 或以上更高级别的平台版本为目标,加上 下面的一句
intent.setComponent(new ComponentName(getPackageName(),getPackageName()+".MyBroadcastReceiver"));
//intent.setComponent(new ComponentName(包名,包名+".MyBroadcastReceiver"));
2、动态注册
  • 创建MyBroadcastReceiver2类,继承BroadcastReceiver
public class MyBroadcastReceiver2 extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,"动态广播------",Toast.LENGTH_SHORT).show();
    }
}


  • 在清单文件(AndroidManifest.xml)中注册
<receiver android:name=".MyBroadcastReceiver2"/>
  • 布局上面有
public class MainActivity extends AppCompatActivity {

    private MyBroadcastReceiver2 receiver2=new MyBroadcastReceiver2();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button=findViewById(R.id.button);
        Button button2=findViewById(R.id.button2);
        //静态注册点击事件
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent=new Intent();
                intent.setAction("com.example.demoh.MyBroadcastReceiver");
                intent.setComponent(new ComponentName(getPackageName(),getPackageName()+".MyBroadcastReceiver"));
                sendBroadcast(intent);
            }
        });

        //动态注册点击事件
        IntentFilter filter=new IntentFilter();
        filter.addAction("com.example.demoh.MyBroadcastReceiver2");
        registerReceiver(receiver2,filter);
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent=new Intent();
                intent.setAction("com.example.demoh.MyBroadcastReceiver2");
                intent.setComponent(new ComponentName(getPackageName(),getPackageName()+".MyBroadcastReceiver2"));
                sendBroadcast(intent);
            }
        });

    }

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

别忘了在onDestroy()中 销毁广播