• 广播有两种,一种是无序广播,一种是有序广播。
  • 无序广播:也称为标准广播,是一种完全异步的广播,在广播发出后,几乎同一时间,所有的广播接收器都可以接受到这广播。他没有先后顺序,这也就是说,他的效率会比较高,而且无法被截断。
  • 有序广播:是一种同步执行的广播,在广播发出后,同一时间,只有一个广播接收器能够接受到该广播,当这个广播接收器中的逻辑执行完毕后,广播才可以继续传递。广播接收器是有优先级的,优先级的高低,决定了接受广播的顺序。并且,在高优先级可以截断广播,使低优先级的接收器无法接受广播。
  • 广播有注册的方式有两种:
  • 静态注册:在清单文件中注册,和动态注册相比,可以让广播接收器在程序未启动的状态也可以接受广播。
•     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 context, Intent 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 context, Intent intent) {
             Log.d("zlx","网络状态发生改变了");
        }
     }
 }
  • 注意点:因为广播中时不可以开启线程的,所以,耗时操作不能放到onReceive()中执行,当onReceive()运行较长时间而没有结束的话,系统就会报错。所以,我们常用广播实现打开程序其他组件。