Broadcast

动态注册

如何创建一个广播接收器,首先创建一个新类,让其继承BroadcastReceiver,并重写父类的onReceive方法。当有广播来到时,onReceive方法就会得到执行,具体的逻辑可以在这个方法中处理。这里我们以监听网络变化为例。

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private IntentFilter intentFilter;
    private NetworkChangReceiver networkChangReceiver;

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

        intentFilter = new IntentFilter();
        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
        networkChangReceiver = new NetworkChangReceiver();
        registerReceiver(networkChangReceiver, intentFilter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(networkChangReceiver);  //动态注册的广播器一定要记得注销
    }

    class NetworkChangReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            ConnectivityManager connectionManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo networkInfo = connectionManager.getActiveNetworkInfo();
            if (networkInfo != null && networkInfo.isAvailable()) {
                Toast.makeText(context, "network is available", Toast.LENGTH_LONG).show();
            } else {
                Toast.makeText(context, "network is unavailable", Toast.LENGTH_LONG).show();
            }
        }
    }
 
}

需要注意的是,这里访问系统的网络状态需要声明权限。

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

发送自定义广播

静态注册一个广播 MyBroadcastReceiver,右击项目,New->Service。

MyBroadcastReceiver代码如下

public class MyBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "received in MyBroadcastReceiver", Toast.LENGTH_SHORT).show();
    }
}

编写AndroidManifest.xml,让MyBroadcastReceiver 接收一条值为test的广播。

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

接着,添加一个按钮,注册对这个按钮的监听事件,发送值为test的广播。

 @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.button:
                Intent intent =new Intent("test");
                sendBroadcast(intent);
        }
    }

发送有序广播

  1. 使用sendOrderBroadcast()发送有序广播,里面有两个参数,一个是Intent,另外一个和权限相关
  2. 在receiver的intent-filter中给广播设置priority,也就是优先级,数字越大优先级越高
  3. 得到接收广播的优先权后,就可以选择是否继续传递广播,在创建的广播接收器中使用abortBroadcast()可以截断广播

使用本地广播

前面我们发送和接收的广播属于系统全局广播,即发出的广播可以被其他人任何应用程序接收,并且我们也可以接收来自于其他应用任何应用程序的广播。这样很容易引起安全问题,为此Android引入一套本地广播机制,使用这个机制发出的广播只能够在应用程序内部进行传递,并且广播接收器也只能接收来自本应用程序发出的广播。本地广播的用法并不复杂,主要就是使用一个LocalBroadcastManager来对广播进行管理,并提供发送广播和注册广播的方法。

首先我们通过LocalBroadcastManager的getInstance()得到它的一个实例。

LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);

剩下的和动态注册的代码基本一致,不同的地方是,我们是用localBroadcastManager.registerReceiver()来注册监听器,用
localBroadcastManager.unregisterReceiver()来销毁监听器,用localBroadcastManager.sendBroadcast()发送广播。

原文地址:https://www.cnblogs.com/ngy-liupeng/p/15217821.html