广播接收器(Broadcast Receiver)

Android 中每个程序都可以对自己需要的广播进行注册,这样的话就能就收到注册广播所发送的内容。

这些广播可以是系统的也可以其他应用程序的。

1.广播类型

广播分两种类型:

标准广播:完全异步的广播,发出广播后所有注册这个广播的程序都会在同一时刻收的这条广播。

有序广播:是一种同步执行的广播,在广播发出后同一时刻只能有一个广播接收器接收这条广播,只有这个接收器中的逻辑执行完毕后,广播才会继续传递。广播是有先后顺序的,优先级高的广播接收器先接收到广播,可以通过 <receiver ... <intent-filter android:priority="100"> 来设置优先级(静态注册和动态注册都可以),并且还可以通过 abortBroadcast(); 将这条广播截断。

2.接收广播

注册广播的两种方式:动态 注册、静态注册

  • (1)动态注册(监听网络状态变化案例)

动态注册可以自由的控制注册和注销,但是必须得在程序运行之后才可以接收到广播。

首先声明网络权限

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

创建一个NetworkChangeReceiver类继承自BroadcastReceiver

    class NetworkChangeReceiver extends BroadcastReceiver {

        @Override  //当网络状态发生变化时执行
        public void onReceive(Context context, Intent intent) {
          
            //得到ConnectivityManager实例 再得到NetworkInfo实例 来判断网络状态
            ConnectivityManager connectivityManager = (ConnectivityManager)
                    getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
            if (networkInfo != null && networkInfo.isAvailable()) {
                Toast.makeText(context, "Network is available", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(context, "Network is unavailable", Toast.LENGTH_SHORT).show();
            }
        }
    }

然后MainActivity中注册广播,使用完后记得取消注册。

public class MainActivity extends AppCompatActivity {

    private NetworkChangeReceiver networkChangeReceiver; //接收器

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

        //动态注册
        IntentFilter intentFilter = new IntentFilter();  
        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); //添加想要监听的广播
        networkChangeReceiver = new NetworkChangeReceiver();

        registerReceiver(networkChangeReceiver, intentFilter); //注册广播
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(networkChangeReceiver);  //活动销毁后 取消注册
    }
  • (2)静态注册(开机启动)

未启动程序的情况下就可以接收到广播

首先声明权限

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

通过Android Studio 来快捷的创建一个广播接收器。

右键包名 --》New--》Other--》Broadcast Receiver ,接着会弹出创建窗口,我们可以设置两个属性,

这两个属性分别是:

Exported :是否允许这个广播接收器接收本程序以外的广播;

Enabled :是否启用这个广播接收器。

接着就帮我们创建好了 MyReceiver,

public class MyReceiver extends BroadcastReceiver {
    public MyReceiver() {
    }
    @Override
    public void onReceive(Context context, Intent intent) {
       Toast.makeText(context, "Starting up", Toast.LENGTH_SHORT).show(); //Toast
    }
}

我们只需要在 onReceive() 写入我们想要执行的逻辑就行。

注意:onReceive()方法中不要在执行过多逻辑或者耗时操作,而且该方法中不允许开启线程,

并且清单文件中自动创建了注册代码

        <receiver
            android:name=".MyReceiver"
            android:enabled="true"
            android:exported="true">
           <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
        </receiver>

android:name 指定注册哪一个广播接收器

<intent-filter> 中添加我们要监听的 Action

3.发送自定义广播

  • 发送标准广播:
        Intent intent=new Intent("com.tiger.broadcasttest.mytest");
        sendBroadcast(intent);

这样的话所有监听 com.tiger.broadcasttest.mytest 这条广播的接收器都会受到这条消息。

另外因为我们是通过Intent进行传递的,我们还可以携带一些数据给其他广播接收器。

  • 发送有序广播:
        Intent intent=new Intent("com.tiger.broadcasttest.mytest");
        sendOrderedBroadcast(intent,null);

4.Receiver 中开启活动

如果想要在广播接收器中开启活动需要 在Intent中添加 FLAG_ACTIVITY_NEW_TASK,否则会报错,因为需要一个栈来存储打开互动

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

        Toast.makeText(context, "Boot complete!", Toast.LENGTH_SHORT).show();
        Intent intentStartActivity=new Intent(context,MainActivity.class);
        intentStartActivity.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intentStartActivity);
    }

5.Receiver 中开启服务

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

        Toast.makeText(context, "Start myservice ", Toast.LENGTH_SHORT).show();
        Intent startService=new Intent(context,MyService.class);
        context.startService(startService);
    }
Last modification:January 14th, 2020 at 07:48 pm