一、广播分类

1.标准广播

没有顺序的广播,完全异步,几乎会同步收到广播,效率高,不能被截断。

2.有序广播

有顺序的广播,只有前面的广播接收器接受完毕(同一时刻只有一个广播接收器能收到消息),后面的广播接收器才能收到。可以设置优先级(优先级高的将会先收到广播消息)。先收到消息的广播接收器可以截断广播,使后面的广播接受器无法再收到。

二、注册广播的方式

1.动态注册(在代码中注册)
public class MainActivity extends Activity {

    private IntentFilter intentFilter;
    private MyReceiver receiver;
    private Button btn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //过滤出需要监听的广播
        intentFilter = new IntentFilter();
        intentFilter.addAction("---换成需要监听的广播内容---");
        //创建接收器实例
        receiver = new MyReceiver ();
        //注册广播
        registerReceiver(receiver,intentFilter);

        btn = (Button) findViewById(R.id.click_btn);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //发送广播
                Intent intent = new Intent("---注册自定义的广播逻辑---");
                sendBroadcast(intent);
                //发送有序广播时使用sendOrderedBroadcast,同时在AndroidManifest中将需要先接收到的接受者优先级(priority)设置高一点,将会截断广播。
                //sendOrderedBroadcast(intent,null);
            }
        });
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //取消注册(这里很重要)
        unregisterReceiver(receiver);
    }

    //这里是一个内部类集成广播接收器,当然也可以是单独的一个文件(在onReceive中完成接收到广播需要操作的逻辑)
    class MyReceiver extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {

        }
    }
}
2.静态注册(在AndroidManifest.xml中注册)
1).AndroidManifest.xml内容
<receiver android:name=".MyBroadcastReceiver">
            <!--priority可以设置优先级-->
            <intent-filter android:priority="100">
                <!--action中是自定义的广播逻辑-->
                <action android:name="com.example.keven.MY_BROADCAST"/>
            </intent-filter>
        </receiver>
2).MyBroadcastReceiver继承自BroadcastReceiver
public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,"received from MyBroadcastReceiver",Toast.LENGTH_SHORT).show();
    }
}
3).代码中再通过事件触发
btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //发送广播
                Intent intent = new Intent("com.example.keven.MY_BROADCAST");
                sendBroadcast(intent);
                //发送有序广播时使用sendOrderedBroadcast,同时在AndroidManifest中将需要先接收到的接受者优先级(priority)设置高一点,将会截断广播。
                //sendOrderedBroadcast(intent,null);
            }
        });

三、本地广播

之前发送和接受的广播都属于系统全局广播,即发出的广播可以被其他任何应用程序接收到,我们也可以接受来自于其他任何应用程序的广播。这样便存在安全隐患。为了解决这个问题,Android引入了一套本地广播机制,使用这个机制发出的广播只能够在应用程序内部进行传递,并且广播接收器也只能接受来自本应用程序发出的广播。 优点:1.安全 2.效率高

本地广播主要使用了LocalBroadcastManager来对广播进行管理,并提供了发送广播和注册广播的方法。(这里修改MainActivity文件进行说明,其实很简单,只是在注册、取消注册以及发送广播之前加上引用就行)

public class MainActivity extends Activity {

    private IntentFilter intentFilter;
    private MyReceiver receiver;
    private Button btn;
    private LocalReceiver localReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //获取LocalBroadcastManager实例
        localBroadcastManager = LocalBroadcastManager.getInstance(this);
        //过滤出需要监听的广播
        intentFilter = new IntentFilter();
        intentFilter.addAction("---换成需要监听的广播内容---");
        //创建接收器实例
        receiver = new MyReceiver ();
        //注册广播
        localBroadcastManager.registerReceiver(receiver,intentFilter);

        btn = (Button) findViewById(R.id.click_btn);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //发送广播
                Intent intent = new Intent("---注册自定义的广播逻辑---");
                localBroadcastManager.sendBroadcast(intent);
                //发送有序广播时使用sendOrderedBroadcast,同时在AndroidManifest中将需要先接收到的接受者优先级(priority)设置高一点,将会截断广播。
                //sendOrderedBroadcast(intent,null);
            }
        });
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //取消注册(这里很重要)
        localBroadcastManager.unregisterReceiver(receiver);
    }

    //这里是一个内部类集成广播接收器,当然也可以是单独的一个文件(在onReceive中完成接收到广播需要操作的逻辑)
    class MyReceiver extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {

        }
    }
}