Android 广播

前言


广播按类型分可分为全局广播和本地广播。

  • 全局广播发出的广播可以被任意应用接收,或者接收任意应用的广播。也就是说无论哪个应用内注册了某个全局广播,这个广播发出时该应用都能接收到。
    (可以静态注册也可以动态注册)

  • 本地广播只能在应用程序内部进行传递,广播接收器也只能接收内部的广播。
    (只能动态注册,需要用到LocalBroadcastManager)


1.广播的发送

广播按发送机制分可分为标准广播和有序广播。

1.1标准广播:

一种完全异步执行的广播。在广播发出后,所有的广播接收器几乎都会在同一时刻接收到这条广播信息,因此他们之间没有任何先后顺序可言。这种广播效率较高。

1.2有序广播:

按照优先级,一级一级向下传递,接收者可以修改广播数据,也可以拦截广播事件。

1.3基本使用

Intent intent=new Intent();
//定义广播事件的类型
intent.setAction("wind.com");
//发送有序广播
sendOrderedBroadcast(intent,null);

sendOrderedBroadcast(intent,null);第一个参数是指定的意图,第二个是指定接收者的权限,不关心权限指定为null

2.广播的接收

Android中提供了一个BroadCastReceiver组件,该组件可以监听来自系统或者应用程序的广播。
使用广播接收者可以接收其他应用程序发出的广播,前提是要在本应用中创建广播接收者进行注册。

2.1广播的注册可分为动态注册和静态注册。

2.2动态注册接收广播基本实现

2.2.1方式一

当一个类中需要发送多个广播时

public class MainActivity extends AppCompatActivity {


    private IntentFilter intentFilter;
    private NetworkChangeReceiver networkChangeReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
//实例化过滤器并设置要过滤的广播  这种方式经常用来发送多个广播
        networkChangeReceiver = new NetworkChangeReceiver();
        intentFilter = new IntentFilter();
        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
        intentFilter.addAction(Intent.ACTION_SCREEN_OFF);
        intentFilter.addAction(Intent.ACTION_SCREEN_ON);
//注册广播
        registerReceiver(networkChangeReceiver, intentFilter);
    }

    class NetworkChangeReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if(action.equals(Intent.ACTION_SCREEN_ON)) {
                  Toast.makeText(context, "监听到开屏广播", Toast.LENGTH_SHORT).show();
            } else if (action.equals(Intent.ACTION_SCREEN_OFF)) {
                  Toast.makeText(context, "监听到熄屏广播", Toast.LENGTH_SHORT).show();
            } else if (action.equals("android.net.conn.CONNECTIVITY_CHANGE")) {
                  Toast.makeText(context, "监听到网络变化广播", Toast.LENGTH_SHORT).show();
            }
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(networkChangeReceiver);
    }
}
2.2.2方式二
//常用来发送单个广播
 Intent intent = new Intent("send.hello");//设了一个自定义的广播
            intent.putExtra("liushi", true);//发送广播时顺便携带了一个boolean类型的数据
            sendBroadcast(intent);//发送



class CustomLockReceiver extends BroadcastReceiver{
        @Override
        public void onReceive(Context context, Intent intent) {
            if(intent.getAction().equals("send.hello")){
                  boolean flag = intent.getBooleanExtra("liushi");
            }
        }
}

2.3静态注册接收广播基本实现

在清单文件中添加

<receiver android:name=".NetReceiver"
            android:enabled="true">
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
            </intent-filter>
        </receiver>

新建一个接收网络变化广播的接收类

public class NetReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d("TAG","发生调用");
    }
}

如果有人实验了可能会发现我们静态注册并没有接收到广播,这是因为"android.net.conn.CONNECTIVITY_CHANGE"这个系统发出的广播在静态注册上只支持到Android7.0,高于这个版本的推荐使用动态注册的方式。(但是它可以作为一个接收广播的静态注册的案例)

3.本地广播的发送

以上举例都可以归属为全局广播,平时我们在应用内用广播发送消息时一般都会用本地广播
(本地广播和全局广播在实现时最大的区别是发送方式的改变)
全局广播发送就是上面的方式。
本地广播发送只需要

LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
posted @ 2020-03-07 13:33  我的小鱼干嘞  阅读(285)  评论(0编辑  收藏  举报