目录
1、广播的分类
1.1 标准广播
是一种完全异步执行的广播,在广播发出去后,所有的广播接收器几乎都会在同一时刻接收到这条广播
1.2 有序广播
是一种同步执行的广播,在广播发出去后,同一时刻只有一个广播接收器能够收到这条广播,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递
2、广播接收器注册
2.1 动态注册
使用步骤:
(1)自定义广播接收器类,继承BroadcastReceiver,并覆写onReceive方法
(2)在onResume方法中使用Context.registerReceiver 注册广播接收器
(3)在onPause方法中使用Context.unregisterReceiver注销广播
(3)使用Context.sendBroadcast 发送广播
自定义广播接收器
static class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "receiver", Toast.LENGTH_SHORT).show();
}
}
注册广播接收器
protected void onResume() {
super.onResume();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("TEST_BROADCAST");
receiver = new MyReceiver();
registerReceiver(receiver, intentFilter);
}
注销广播
@Override
protected void onPause() {
super.onPause();
unregisterReceiver(receiver);
}
发送广播
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_broad_cast);
Button btn = findViewById(R.id.broadcast);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent();
intent.setAction("TEST_BROADCAST");
sendBroadcast(intent);
}
});
}
2.2 静态注册
(1)在AndroidManifest.xml中注册
(2)Android8.0以上,发送广播时,需要指定packageName,否则静态广播接收器接收不到广播
<receiver android:name=".broadcast.MyReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="TEST_BROADCAST"/>
</intent-filter>
</receiver>
Intent intent = new Intent();
intent.setPackage(getPackageName());
intent.setAction("TEST_BROADCAST");
sendBroadcast(intent);
3、自定义广播
3.1 发送标准广播
通过Context.sendBroadcast发送的广播都是标准广播
3.2 发送有序广播
(1)通过Context.sendOrderedBroadcast发送有序广播
(2)在inten-filter上设置android:priority="100"优先级,数字越大优先级越高
(3)可以在广播接收器中调用setResultExtras向下一个广播接收器传递数据
发送有序广播
Intent intent = new Intent();
intent.setPackage(getPackageName());
intent.setAction("TEST_BROADCAST");
sendOrderedBroadcast(intent, null);
设置广播接收器的优先级
<receiver android:name=".broadcast.MyReceiver"
>
<intent-filter android:priority="150">
<action android:name="TEST_BROADCAST"/>
</intent-filter>
</receiver>
<receiver android:name=".broadcast.MyReceiver1"
>
<intent-filter android:priority="100">
<action android:name="TEST_BROADCAST"/>
</intent-filter>
</receiver>
广播接收器传递数据
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = new Bundle();
bundle.putString("MyReceiver", "666");
setResultExtras(bundle);
Toast.makeText(context, "receiver", Toast.LENGTH_SHORT).show();
}
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = getResultExtras(true);
Toast.makeText(context, bundle.getString("MyReceiver"), Toast.LENGTH_SHORT).show();
}
4、本地广播
(1)本地广播是无法通过静态注册方式来接收的
(2)本地广播发送不会离开我们程序,不必担心会有安全问题
(3)发送本地广播更加高效
(5)使用方式如下
(5.1)获取LocalBroadcastManager对象
(5.2)通过LocalBroadcastManager注册本地广播
(5.3)通过LocalBroadcastManager发送广播
(5.4)本地广播注销
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_broad_cast);
// 1、获取LocalBroadcastManager对象
localBroadcastManager = LocalBroadcastManager.getInstance(this);
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("TEST_BROADCAST");
receiver = new MyReceiver();
// 2、通过LocalBroadcastManager注册本地广播
localBroadcastManager.registerReceiver(receiver, intentFilter);
Button btn = findViewById(R.id.broadcast);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent();
intent.setPackage(getPackageName());
intent.setAction("TEST_BROADCAST");
intent.putExtra("data", "666");
// 3、通过LocalBroadcastManager发送广播
localBroadcastManager.sendBroadcast(intent);
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
// 4、本地广播注销
localBroadcastManager.unregisterReceiver(receiver);
}