Android 开发的四大组件(三)-Broadcast Receiver

「这是我参与2022首次更文挑战的第27天,活动详情查看:2022首次更文挑战

前面介绍了Android开发过程中最常用的2个组件,Activity和Service,咱不按顺序介绍,按照使用的场景化介绍,这篇文章,我们介绍广播,也就是Broadcast Receiver,这个其实用的还是比较多,它很多时候是与Activity和Service一起使用,下面就来介绍它。

Broadcast Receiver定义

BroadcastReceiver(广播接收器)是Android四大组件之一,顾名思义,通过广播的方式进行消息传递,其本质是一个全局的监听器,可以监听到各种广播,可以用来实现不同组件之间的通信。广播最大的特点就是发送方并不关心接收方是否接到数据,也不关心接收方是如何处理数据的,通过这样的形式来达到接、收双方的完全解耦合。BroadcastReceiver包括两个概念,广播发送者和广播接收者(Receiver),这里的广播实际就是指Intent,程序可以自己发送广播自己接收,也可以接受系统或其他应用的广播或是发送广播给其他应用程序。

BroadcastReceiver 的类型

我们开发中用到的比较多的是普通广播和有序广播,普通广播对应于有序广播,也叫无序广播。

普通广播

又称无序广播,这种广播完全是异步的,所有与广播Intent匹配的BroadcastReceiver,都可以收到这条广播,并且不分先后顺序,视为同时收到,通过Context.sendBroadcast()方法发送。这种广播的效率比较高,但缺点是接收器不能将处理结果传递给下一个接收器,并且无法在中途终止广播。

有序广播

这是一种同步执行的广播,通过Context.sendOrderedBroadcast()方法发送,这种广播发出后,通过receiver的intent-filter中的android:priority属性来设置优先级,优先级从-1000~1000,数越大,优先级越高,使用setResult()方法把结果传递给下一个接收者,通过getResult()方法获取上一个接收者传递过来的结果,并可以通过abortBroadcast()方法丢弃该广播,使该广播不再传递给下一个接收者。

BroadcastReceiver的使用

在使用广播的时候,和使用Activity以及Service一样,都是需要在清单里面注册,当然广播也可以在代码里动态注册。

写一个简单的系统广播监听,先创建一个继承广播的类:MyBroadCastReceiver

public class MyBroadCastReceiver extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,"网络状态发生改变~",Toast.LENGTH_SHORT).show();
    }
}
复制代码

这里打印简单的toast提示,写一个广播发生的类,MainActivity:

public class MainActivity extends AppCompatActivity {

    MyBRReceiver myReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //核心部分代码:
        myReceiver = new MyBroadCastReceiver();
        IntentFilter itFilter = new IntentFilter();
        itFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
        registerReceiver(myReceiver, itFilter);
    }

    //取消注册广播
    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(myReceiver);
    }
}
复制代码

简单说明下,动态注册和静态注册的区别,动态注册就是需要程序启动才能接受广播,静态注册,程序没有启动也可以接受到。

完成上面的代码之后,只要切换网络状态就会收到广播啦。是不是很简单,其实广播使用起来是比较简单的。这里介绍的是使用系统自带的广播,那么我们自定义的广播怎么发送呢,代码也很简单:

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button btn_send = (Button) findViewById(R.id.btn_send);
        btn_send.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                sendBroadcast(new Intent("com.test.broadcasttest.MY_BROADCAST"));
            }
        });
    }
}
复制代码
<receiver android:name=".MyBroadcastReceiver">
    <intent-filter>
        <action android:name="com.test.broadcasttest.MY_BROADCAST"/>
    </intent-filter>
</receiver>
复制代码

好啦,是不是也很简单,再写一个同样的接收广播的:


public class MyBroadcastReceiver extends BroadcastReceiver {
    private final String ACTION_BOOT = "com.test.broadcasttest.MY_BROADCAST";
    @Override
    public void onReceive(Context context, Intent intent) {
        if(ACTION_BOOT.equals(intent.getAction()))
        Toast.makeText(context, "收到广播啦~",Toast.LENGTH_SHORT).show();
    }
}

复制代码

BroadcastReceiver使用的注意事项

其实广播使用起来很简单,但是有个必须注意的事情,那就是不能在接收的方法里,也就是当onReceiver里面做过多的耗时操作,否则就会导致ANR,因为在广播中就不能开辟新的线程去执行的。

广播其实在系统中是应用比较广泛的,这里主要介绍的都是全局广播,不光自己应用可以收到,如果别的应用也知道了你设置的action,在接收方法里也可以收到,这里就会有一些性能损耗和安全问题,当然广播也有本地广播(Local Broadcast),本地广播就是只能在本应用里使用的广播,这里就不多介绍了,有兴趣的可以网上查看下相关资料。

广播就介绍到这里了,有什么不对的地方还请指正,欢迎留言评论。

おすすめ

転載: juejin.im/post/7067136727286022157