zoukankan      html  css  js  c++  java
  • Android:日常学习笔记(9)———探究广播机制

    Android:日常学习笔记(9)———探究广播机制

    引入广播机制

    Andorid广播机制

      广播是任何应用均可接收的消息。系统将针对系统事件(例如:系统启动或设备开始充电时)传递各种广播。通过将 Intent 传递给 sendBroadcast()sendOrderedBroadcast() 或 sendStickyBroadcast(),您可以将广播传递给其他应用。

      Android提供了一套完整的API,允许应用程序自由地发送和接受广播。发送广播使用Intent,接受广播使用 广播接收器(Boradcast Receiver)

      广播分成两种类型:

    •   标准广播:一种完全异步的广播,在广播发出之后,所有的广播接收器几乎同时收到这条广播信息。
    •   有序广播:一种同步执行的广播,在广播发出之后,所有的接收器根据先后顺序依次收到,并且可以被截获。

    接受系统广播

      广播接收器可以自由地对自己感兴趣的广播进行注册,这样当相应的广播发出时,广播接收器就可以收到这条广播,并在内部处理逻辑。

    动态注册:在代码中注册

    创建广播接收器的步骤:

    1.新建一个类使其继承BroadcastReceiver

    2.重写onReceive()方法

    public class MyBroadCastReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(context,"network changes",Toast.LENGTH_LONG).show();
        }
    }

    3.为接受器绑定要接受的广播

    public class MainActivity extends AppCompatActivity {
       
        
        private IntentFilter intentFilter; 
    /*
    Structured description of Intent values to be matched. An IntentFilter can match against actions, categories, and data (either via its type, scheme, and/or path) in an Intent. It also includes a "priority" value which is used to order multiple matching filters.
    */
        private MyBroadCastReceiver myReceiver;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        
            intentFilter = new IntentFilter();
            intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
           //需要广播器接受什么样的广播,就在这里添加什么样的action
            myReceiver = new MyBroadCastReceiver();
            registerReceiver(myReceiver,intentFilter);
           //注册
            
        }
    
        @Override
        protected void onDestroy() {
            unregisterReceiver(myReceiver);
          //动态注册的广播一定要取消注册才行
            super.onDestroy();
        }
        

    获取精确的网络状态:

    1.修改接收器代码

    public class MyBroadCastReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
    
            ConnectivityManager connectivityManager =
                    (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
            //这是一个系统服务类,专门用于管理网络连接
            NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
            if(networkInfo!=null&&networkInfo.isAvailable())
            {
                Toast.makeText(context,"获得网络连接",Toast.LENGTH_LONG).show();
            }
            else
            {
                Toast.makeText(context,"失去网络连接",Toast.LENGTH_LONG).show();
    
            }
    
        }
    }

    3.声明程序权限

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.zy.dealhelper">
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
        <application
         .....
        </application>
    
    </manifest>

    说明:涉及用户隐私的状态信息必须要到AndroidManifest.xml中进行声明

    静态注册:在AndroidManifest.xml中进行声明

    说明:静态注册最大的特点就是程序未启用的情况下便可接受到广播

    使用AS自动生成广播接收器

    1.新建一个广播接收器

     2.配置广播接收器

    public class BootCompleteReceiver extends BroadcastReceiver {
    
        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(context,"Boot Complete",Toast.LENGTH_LONG).show();
        }
    }

    3.手动注册

     发送自定义广播

     发送标准广播

    1.首先定义了自己的广播接收器并且配置了广播名

    public class MyReceiver extends BroadcastReceiver {
    
        @Override
        public void onReceive(Context context, Intent intent) {
    
      Toast.makeText(context,"收到我自己发送的广播"+intent.getExtras().getString("info"),Toast.LENGTH_SHORT).show();
    } }
            <receiver
                android:name=".broadcast.MyReceiver"
                android:enabled="true"
                android:exported="true">
                <intent-filter>
                    <action android:name="com.expample.zy.MY_BROADCAST"></action>
                </intent-filter>
            </receiver>

    2.发送广播

                    Intent broadCastIntent = new Intent("com.example.zy.MY_BROADCAST");
                    broadCastIntent.putExtra("info","你好啊");
                    sendBroadcast(broadCastIntent);

    发送有序广播

    0.设置接收器的优先等级

    <intent-filter android:priority="100">
    <action android:name="com.example.zy.MY_BROADCAST"></action>
    </intent-filter>

    1.发送有序广播

    sendOrderedBroadcast(intent,null);

    2.截获

    public class MyReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
    Toast.makeText(context,"收到我自己发送的广播"+intent.getExtras().getString("info"),Toast.LENGTH_SHORT).show();
    abortBroadcast();
    }
    }

    使用本地广播

    为什么使用本地广播?

    前面我们接收和发送的广播全部属于系统全局广播,即发出的广播可以被其他任何应用程序接收到,并且我们也可以接收到来自其他应用程序的广播,这样就容易引起安全性问题。为此Android引入了一套本地广播机制,使用这个机制发出的广播仅仅能在应用程序内部进行传递。

    实例  

    public class MainActivity extends AppCompatActivity {
        private LocalBroadcastManager localBroadcastManager;
        private IntentFilter intentFilter;
        private MyBroadCastReceiver myReceiver;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            localBroadcastManager = LocalBroadcastManager.getInstance(this);
            //1.获取本地管理器实例
            setContentView(R.layout.activity_main);
    
            intentFilter = new IntentFilter();
            intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
            myReceiver = new MyBroadCastReceiver();
            localBroadcastManager.registerReceiver(myReceiver,intentFilter);
            //2.使用本地广播管理器进行动态注册
    
            });
        }
    
        @Override
        protected void onDestroy() {
            localBroadcastManager.unregisterReceiver(myReceiver);
            //3.使用本地广播管理器动态卸载
            super.onDestroy();
        }
    }
  • 相关阅读:
    网络常用的linux系统调用
    如何在Linux下写无线网卡的驱动【转】
    理解 Linux 配置文件【转】
    每天一个linux命令【转】
    宏定义编写技巧__调试技巧【原创】
    linux 高级字符设备驱动 ioctl操作介绍 例程分析实现【转】
    Linux驱动总结3- unlocked_ioctl和堵塞(waitqueue)读写函数的实现 【转】
    初识CPU卡、SAM卡/CPU卡简介、SAM卡简介 【转】
    android中跨进程通讯的4种方式
    MISC混杂设备 struct miscdevice /misc_register()/misc_deregister()【转】
  • 原文地址:https://www.cnblogs.com/MrSaver/p/6895396.html
Copyright © 2011-2022 走看看