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


    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();
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 在清单文件(AndroidManifest.xml)中注册
     <receiver android:name=".MyBroadcastReceiver" android:enabled="true" android:exported="true">
                <intent-filter>
                    <action android:name="com.example.demoh.MyBroadcastReceiver"/>
                </intent-filter>
      </receiver>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 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);
                }
            });
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    `注意:如果点击无效果,不发送广播,或者您的应用以 API 级别 26(安卓8.0) 或以上更高级别的平台版本为目标,加上 下面的一句
    intent.setComponent(new ComponentName(getPackageName(),getPackageName()+".MyBroadcastReceiver"));
    //intent.setComponent(new ComponentName(包名,包名+".MyBroadcastReceiver"));
    
    • 1
    • 2
    2、动态注册
    • 创建MyBroadcastReceiver2类,继承BroadcastReceiver
    public class MyBroadcastReceiver2 extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(context,"动态广播------",Toast.LENGTH_SHORT).show();
        }
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 在清单文件(AndroidManifest.xml)中注册
    <receiver android:name=".MyBroadcastReceiver2"/>
    
    • 1
    • 布局上面有
    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);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

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

  • 相关阅读:
    EN 13859-2防水用柔性薄板—CE认证
    5分钟了解系统架构设计
    Java 与 Go:可变数组
    代码随想录二刷day34
    gitlab将本地文件项目上传至gitlab服务
    OpenKylin适配和虚拟打印机
    Gradio学习(五)—————学习一下布局Column的使用
    FusionCharts Suite XT
    linux常见命令
    科目一扣分
  • 原文地址:https://blog.csdn.net/afufufufu/article/details/126101970