zoukankan      html  css  js  c++  java
  • Android的广播接收器BroadcastReceiver

    一、广播分为标准广播有序广播,本地广播。Android内置了很多系统广播,我们可以监听这些广播来得到系统信息,如开机完成后的广播,电池电量变化广播等等。

            标准广播:系统内广播,任何应用几乎同时收到

            有序广播(一般静态注册):系统内广播,应用按优先级分先后收到,先收到的广播接收器可切断该广播继续往下传播

            本地广播(只能动态注册):应用内广播,只能在应用内传播,安全性高,推荐使用

    二、广播的俩种注册方式: 静态注册,动态注册,注册后必须在onDestroy()里取消注册广播接收器

            不管是动态注册还是静态注册,若涉及到系统关键信息都需要在XML注册文件添加权限

            如:        

            //监听开机广播权限
    
            <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    
            对应的系统广播:android.intent.action.BOOT_COMPLETED
    
            //查询系统网络状态权限
    
            <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>      
    
            对应的系统广播:android.net.conn.CONNECTIVITY_CHANGE

         静态注册:在XML注册文件里注册广播接收器和发送的广播,后定义广播接收类继承于BroadcastReceiver,重写

                           onReceive(Context context,  Intent intent)

            格式:       

             <receiver
                android:name=".广播接收器类名">
                <intent-filter>
                    <action android:name="自定义广播或系统广播" />
                </intent-filter>
             </receiver>
    
            public class MyBroadcastReceiver extends BroadcastReceiver {
                    public void onReceive(Context context, Intent intent) {
                            Toast.makeText(context, "接收到标准广播",Toast.LENGTH_SHORT).show();
                            abortBroadcast();
                    }
    
              }

        动态注册:直接在Activity类里调用registerReceiver(BroadcastReceive,IntentFilter)方法发送广播,后定义广播接收

                            类继承于BroadcastReceiver,重写onReceive(Context context,Intent intent)

            Activity补充方法 :         

    registerReceiver(BroadcastReceive,IntentFilter):注册广播接收器
    
    unregisterReceiver( BroadcastReceive):取消注册广播接收器
    
    sendBroadcast(Intent):发送标准广播
    
    sendOrderedBroadcast(Intent,null):发送有序广播,有序广播在intent-filter标签的android:priority    
                                      属性设置优先级,采用静态注册方式。
    
    abortBroadcast():在onReceive()里调用,用来截断有序广播

            Intent补充知识:         

    ​
    Intent(String):String为被启动活动的XML文件里的<intent-filter>里的<action>里的android:name属性
    值,在发送广播时String为系统广播或自定义广播,也就是<receiver>里的<intent-filter>里的<action> 里
    的android:name属性值
    
    ​

           IntentFilter类:通过Intent的 <action>标签的android:name属性过滤掉不对应的广播

       方法:addAction(String):String为系统广播或自定义广播     
      动态提醒网络变化例子(记得添加权限和在Activity里注册广播接收器):
    
    public void onReceive(Context context, Intent intent) {
    
               Connectivity ManagerconnctivityManager=
    
                         (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
    
               NetworkInfo networkInfo=connctivityManager.getActiveNetworkInfo();
               if(networkInfo!=null&&networkInfo.isAvailable()) {
                   Toast.makeText(context, "网络可用", Toast.LENGTH_SHORT).show();
               }else {
                    Toast.makeText(context, "网络不可用", Toast.LENGTH_SHORT).show();
               }
    }

    三、本地广播发送(接收不到系统广播,即接收不到标准广播和有序广播,只能接收自己发送的自定义本地广播)

           1、 需要导入android-support-v4.jar包

            Eclipse导入方法: 
            Project >> Properties >> Java Build Path >> Libraries >> Add External JARs 
            找到之前下载好的android-support-v4.jar,打开后可以看到已经添加进去列表中了,此时还需要点击 Order and Export,勾        选android-support-v4.jar 这一项,然后点击OK即可。 
            此时回到代码界面,按快捷键ctrl + shift + O即可自动导入LocalBroadcastManager。 
            也可以手动导入:

    import android.support.v4.content.LocalBroadcastManager;

            完成后LocalBroadcastManager 不再报错,ctrl + S保存并刷新MainActivity.java。 

            程序即可正常运行。

            2、与动态注册一样接收使用IntentFilter类和自定义广播接收类接收广播,不同点在于注册广播,发送广播,取消注册广播              都使用LocalReceiverManager类,不使用Activity类,但仍需写在Activity里.       

     LocalBroadcastManager类用来发送广播有以下方法:
    
            LocalBroadcastManager.getInstance(this):静态方法,构建一个LocalBroadcastManager类实例
    
            registerReceiver(BroadcastReceive,IntentFilter):注册广播接收器
    
            unregisterReceiver( BroadcastReceive):取消注册广播接收器
    
            sendBroadcast(Intent):发送标准广播
  • 相关阅读:
    BNUOJ-26474 Bread Sorting 逆序对
    POJ-2480 Longge's problem 积性函数
    Bzoj-2705 Longge的问题 欧拉函数
    Bzoj-2820 YY的GCD Mobius反演,分块
    HDU-4689 Derangement DP
    [转]初学者程序语言的选择
    HDU-4705 Y 树形DP
    HDU-4704 Sum 大数幂取模
    HDU-4699 Editor 数据结构维护
    HDU-4696 Answers 纯YY
  • 原文地址:https://www.cnblogs.com/MrQlyn/p/10236337.html
Copyright © 2011-2022 走看看