广播机制一(广播接收器)

    xiaoxiao2025-01-14  9

    广播有两种,一种是无序广播,一种是有序广播。 无序广播:也称为标准广播,是一种完全异步的广播,在广播发出后,几乎同一时间,所有的广播接收器都可以接受到这广播。他没有先后顺序,这也就是说,他的效率会比较高,而且无法被截断。有序广播:是一种同步执行的广播,在广播发出后,同一时间,只有一个广播接收器能够接受到该广播,当这个广播接收器中的逻辑执行完毕后,广播才可以继续传递。广播接收器是有优先级的,优先级的高低,决定了接受广播的顺序。并且,在高优先级可以截断广播,使低优先级的接收器无法接受广播。 广播有注册的方式有两种: 静态注册:在清单文件中注册,和动态注册相比,可以让广播接收器在程序未启动的状态也可以接受广播。 清单文件: <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"     package="com.example.mac.broadcast_demo">     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />     <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />S     <application         android:allowBackup="true"         android:icon="@mipmap/ic_launcher"         android:label="@string/app_name"         android:supportsRtl="true"         android:theme="@style/AppTheme">         <activity android:name=".MainActivity">             <intent-filter>                 <action android:name="android.intent.action.MAIN" />                 <category android:name="android.intent.category.LAUNCHER" />             </intent-filter>         </activity>         <!--静态注册服务-->         <receiver android:name=".BootCompleteReceiver">             <intent-filter>                 <action android:name="android.intent.action.BOOT_COMPLETED" />             </intent-filter>         </receiver>     </application> </manifest>我们需要新建一个类来继承我们的广播类BroadcastReceiver,然后在onReceive()中写逻辑代码就可以了。 package com.example.mac.broadcast_demo; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.util.Log; /**  * Created by mac on 16/8/13.  */ public class BootCompleteReceiver extends BroadcastReceiver {     @Override     public void onReceive(Context contextIntent intent) {         Log.d("zlx","系统启动了");     } }这样就完成了广播的静态注册。 动态注册:在代码中注册,广播接收器可以自由的进行注册和注销,具有很高的灵活性,但是必须是程序启动后才可以注册广播。因为注册的代码时是写在onCreate()方法中的。 新建一个类,让他继承父类BroadcastReceiver,并重写父类onReceive()方法就可以了。当接收到广播的时候,在这个方法里面实现逻辑即可。如下,实现了一个查询是否有网络的广播: public class MainActivity extends AppCompatActivity {     private IntentFilter intentFilter;     private NetworkBroadcast networkBroadcast;     @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.activity_main);         intentFilter=new IntentFilter();         networkBroadcast=new NetworkBroadcast();         //添加动作,检测网络状态         intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");         //启动服务         registerReceiver(networkBroadcast,intentFilter);     }     @Override     protected void onDestroy() {         super.onDestroy();         //关闭广播         unregisterReceiver(networkBroadcast);     }     class NetworkBroadcast extends BroadcastReceiver{         @Override         public void onReceive(Context contextIntent intent) {             Log.d("zlx","网络状态发生改变了");         }     } } 注意点:因为广播中时不可以开启线程的,所以,耗时操作不能放到onReceive()中执行,当onReceive()运行较长时间而没有结束的话,系统就会报错。所以,我们常用广播实现打开程序其他组件。                                         
    转载请注明原文地址: https://ju.6miu.com/read-1295455.html
    最新回复(0)