• 一行代码第五章


    书籍

    5.1 广播机制简介

    1. 标准广播
      在这里插入图片描述

    2. 有序广播
      在这里插入图片描述

    5.2 接收广播系统

    1. 动态注册(在代码中注册)

    1. 首先我们创建了一个IntentFilter的实例,并给它添加了一个值为android.net.conn.CONNECTIVITY_CHANGE的action,为什么要添加这个值呢?因为当网络状态发生变化时,系统发出的正是一条值为android.net.conn.CONNECTIVITY_CHANGE的广播,也就是说我们的广播接收器想要监听什么广播,就在这里添加相应的action。
    
    public class MainActivity extends AppCompatActivity {
        private IntentFilter intentFilter;
        private NetworkChangeReceiver networkChangeReceiver;
    
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            intentFilter = new IntentFilter(); // 3.创建一个IntentFilter实例
            intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");// 4.表示该实例监听该活动(广播)
            networkChangeReceiver = new NetworkChangeReceiver();
            registerReceiver(networkChangeReceiver, intentFilter);// 5.注册接收器
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            unregisterReceiver(networkChangeReceiver);// 注册的广播必须在onDestroy注销
        }
        // 1.定义一个内部类,继承广播接收器
        class NetworkChangeReceiver extends BroadcastReceiver {
    //         @param context The Context in which the receiver is running.
    //         @param intent  The Intent being received.
    //       2.重写onReceive方法
            @Override
            public void onReceive(Context context, Intent intent) {
                ConnectivityManager connectivityManager = (ConnectivityManager)
                    getSystemService(Context.CONNECTIVITY_SERVICE);
                NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
                if(networkInfo != null && networkInfo.isAvailable()) {
                    Toast.makeText(context, "network is available", Toast.LENGTH_SHORT).show();
    
                } else {
                    Toast.makeText(context, "network is unavailable", Toast.LENGTH_SHORT).show();
    
                }
            }
    
        }
    
    }
    
    • 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
    • 43
    • 44

    2. 静态注册(在AndroidManifest.xml)中注册)

    1. 动态注册的广播接收器可以自由地控制注册与注销,在灵活性方面有很大的优势,但是它也存在着一个缺点,即必须要在程序启动之后才能接收到广播,因为注册的逻辑是写在onCreate()方法中的。那么有没有什么办法可以让程序在未启动的情况下就能接收到广播呢?这就需要使用静态注册的方式了。

    5.3 发送定义广播

    1. 定义一个MyBroadcastReceiver
    public class MyBroadcastReceiver extends BroadcastReceiver {
    
        @Override
        public void onReceive(Context context, Intent intent) {
            // TODO: This method is called when the BroadcastReceiver is receiving
            // an Intent broadcast.
            Log.e("Receive broadcast", "onReceive: receive");
            Toast.makeText(context, "收到我的广播", Toast.LENGTH_LONG).show();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    1. 在Manifest中声明
     <receiver
                android:name=".MyBroadcastReceiver"
                android:enabled="true"
                android:exported="true">
                <intent-filter>
                    <action android:name="com.example.mybroadcast.MY_BROADCAST" /> // 这里表示广播的值
                intent-filter>
            receiver>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    1. 在MainActivity中发送广播
       <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/button"
            android:text="Send Broadcast"/>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Button button = (Button) findViewById(R.id.button);
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent("com.example.mybroadcast.MY_BROADCAST");
                    intent.putExtra("message", "我的广播");
                    // 在Android8.0 API26更高版本,你不能使用清单为大多数隐式广播(不是专门针对你的应用的广播)声明接收器
                    // 定义的静态广播必须指定范围(应用)
                    intent.setPackage(getPackageName());
                    sendBroadcast(intent);
                    Log.e("send broadcast", "onClick:send ");
                }
            });
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    1. 有序广播只需要修改sendBroadcast(intent);为sendOrderedBroadcast(intent, null); // 第二个参数为权限相关
    2. 在Manifest 中增加优先级 这样就可以设定哪个接收器先接收到
    3. 通过在接收器中使用abortBroadcast();可以终止广播

    5.4 使用本地广播

    public class MainActivity extends AppCompatActivity {
        private IntentFilter intentFilter;
        private LocalBroadcastManager localBroadcastManager;
        private LocalReceiver localReceiver;
        @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 View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent("com.example.mybroadcast.MY_BROADCAST");
                    localBroadcastManager.sendBroadcast(intent);
                    // 在Android8.0 API26更高版本,你不能使用清单为大多数隐式广播(不是专门针对你的应用的广播)声明接收器
                    // 定义的静态广播必须指定范围(应用)
    //                intent.setPackage(getPackageName());
    //                sendBroadcast(intent);
    //                sendOrderedBroadcast(intent, null); // 第二个参数为权限相关
                    Log.e("send local broadcast", "onClick:send ");
                }
            });
    
            intentFilter = new IntentFilter(); //构建实例,并添加活动
            intentFilter.addAction("com.example.mybroadcast.MY_BROADCAST");
            localReceiver = new LocalReceiver();
            localBroadcastManager.registerReceiver(localReceiver, intentFilter); // 注册本地广播
        }
    
        @Override
        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_LONG).show();
            }
        }
    }
    
    • 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
    • 43
    • 44
    • 45
  • 相关阅读:
    Unity WebGL RuntimeError: integer overflow(整数溢出问题)
    优先队列使用
    Multi-scalar multiplication: state of the art & new ideas
    给Tomcat添加第三方jar包、如何在IDEA中启动部署Web模板
    【基本算法题-2022.7.30】10. 约数之和
    车载通信架构 —— 传统车内通信网络发展回顾
    进阶Linux服务器命令
    shiro授权
    小程序开发.微信小程序.组件.视图容器
    Hadoop分布式文件系统——HDFS
  • 原文地址:https://blog.csdn.net/qq_43357874/article/details/126167477