zoukankan      html  css  js  c++  java
  • Android 广播

    前言


    广播按类型分可分为全局广播和本地广播。

    • 全局广播发出的广播可以被任意应用接收,或者接收任意应用的广播。
      (可以静态注册也可以动态注册)

    • 本地广播只能在应用程序内部进行传递,广播接收器也只能接收内部的广播。
      (只能动态注册,需要用到LocalBroadcastManager)


    1.广播的发送

    广播按发送机制分可分为标准广播和有序广播。

    1.1标准广播:

    一种完全异步执行的广播。在广播发出后,所有的广播接收器几乎都会在同一时刻接收到这条广播信息,因此他们之间没有任何先后顺序可言。这种广播效率较高。

    1.2有序广播:

    按照优先级,一级一级向下传递,接收者可以修改广播数据,也可以拦截广播事件。

    1.3基本使用

    Intent intent=new Intent();
    //定义广播事件的类型
    intent.setAction("wind.com");
    //发送有序广播
    sendOrderedBroadcast(intent,null);
    

    sendOrderedBroadcast(intent,null);第一个参数是指定的意图,第二个是指定接收者的权限,不关心权限指定为null

    2.广播的接收

    Android中提供了一个BroadCastReceiver组件,该组件可以监听来自系统或者应用程序的广播。
    使用广播接收者可以接收其他应用程序发出的广播,前提是要在本应用中创建广播接收者进行注册。

    2.1广播的注册可分为动态注册和静态注册。

    2.2动态注册接收广播基本实现

    2.2.1方式一
    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);
    //实例化过滤器并设置要过滤的广播  这种方式经常用来发送多个广播
            networkChangeReceiver = new NetworkChangeReceiver();
            intentFilter = new IntentFilter();
            intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
            intentFilter.addAction(Intent.ACTION_SCREEN_OFF);
            intentFilter.addAction(Intent.ACTION_SCREEN_ON);
    //注册广播
            registerReceiver(networkChangeReceiver, intentFilter);
        }
    
        class NetworkChangeReceiver extends BroadcastReceiver {
    
            @Override
            public void onReceive(Context context, Intent intent) {
                String action = intent.getAction();
                if(action.equals(Intent.ACTION_SCREEN_ON)) {
                      Toast.makeText(context, "监听到开屏广播", Toast.LENGTH_SHORT).show();
                } else if (action.equals(Intent.ACTION_SCREEN_OFF)) {
                      Toast.makeText(context, "监听到熄屏广播", Toast.LENGTH_SHORT).show();
                } else if (action.equals("android.net.conn.CONNECTIVITY_CHANGE")) {
                      Toast.makeText(context, "监听到网络变化广播", Toast.LENGTH_SHORT).show();
                }
            }
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            unregisterReceiver(networkChangeReceiver);
        }
    }
    
    2.2.2方式二
    //常用来发送单个广播
     Intent intent = new Intent("send.hello");//设了一个自定义的广播
                intent.putExtra("liushi", true);//发送广播时顺便携带了一个boolean类型的数据
                sendBroadcast(intent);//发送
    
    
    
    class CustomLockReceiver extends BroadcastReceiver{
            @Override
            public void onReceive(Context context, Intent intent) {
                if(intent.getAction().equals("send.hello")){
                      boolean flag = intent.getBooleanExtra("liushi");
                }
            }
    }
    

    2.3静态注册接收广播基本实现

    在清单文件中添加

    <receiver android:name=".NetReceiver"
                android:enabled="true">
                <intent-filter>
                    <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
                </intent-filter>
            </receiver>
    

    新建一个接收网络变化广播的接收类

    public class NetReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.d("TAG","发生调用");
        }
    }
    

    如果有人实验了可能会发现我们静态注册并没有接收到广播,这是因为"android.net.conn.CONNECTIVITY_CHANGE"这个系统发出的广播在静态注册上只支持到Android7.0,高于这个版本的推荐使用动态注册的方式。(但是它可以作为一个接收广播的静态注册的案例)

  • 相关阅读:
    XCOJ1250: 语言战争
    XCOJ 1249: 全自动奖学金计算系统
    杭电 2159 fate(二维背包费用问题)
    杭电 1059 Dividing
    背包问题的模版
    Shell解析器
    Shell简介
    SpringBoot配置文件占位符
    @ImportResource、@Bean
    @ImportResource注解;
  • 原文地址:https://www.cnblogs.com/dearnotes/p/12366714.html
Copyright © 2011-2022 走看看