最近在学习安卓广播的时候遇到的静态与动态自定义广播中的区别与联系,现将此总结一下
概念
动态注册广播
在java代码中进行注册的广播,程序运行之后广播才正常生效。
静态注册广播
在xml中进行注册的广播,在程序启动之前就进行了注册。
根据静态与动态广播的特点,可以看出动态广播有其局限性,在程序启动之后才正常生效,并伴随着活动的销毁而停止。静态广播在启动之前就完成了注册,声明周期与程序的生命周期相同。
实例
静态自定义广播
- 修改mainfest.xml文件,注册静态自定义广播
<receiver android:name=".day3.all.broadcast.static_state.MyBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="MY_STATIC_BROADCAST" />
</intent-filter>
</receiver>
- 新建活动进行广播的发送,注意第二行:静态广播在安卓8.0之后必须指明广播的接收者,也就是广播接收者的类名
// 发送广播
Intent intent = new Intent("MY_STATIC_BROADCAST");
intent.setComponent(new ComponentName(getPackageName(),"com.example.myapp.day3.all.broadcast.static_state.MyBroadcastReceiver"));
intent.putExtra("data","data123456");
sendBroadcast(intent)
- 新建广播接收者接收广播
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "接收到静态注册的广播!!!", Toast.LENGTH_LONG).show();
}
}
动态自定义广播
- java代码中注册并发送广播,注意!!!动态注册的广播不可以指定广播的接收者,否则会发送失败
private MyBroadcastReceiver myBroadcastReceiver;
myBroadcastReceiver = new MyBroadcastReceiver();
IntentFilter intentFilter = new IntentFilter();
// 动态注册广播
intentFilter.addAction("MY_BROADCAST");
registerReceiver(myBroadcastReceiver,intentFilter);
// 发送广播
Intent intent = new Intent("MY_BROADCAST");
//intent.setComponent(new ComponentName(getPackageName(),"com.example.myapp.day3.all.broadcast.dynamic_state.MyBroadcastReceiver"));
intent.putExtra("data","data123456");
sendBroadcast(intent);
- 新建广播接收者接收广播
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "接收到动态注册的广播!!!", Toast.LENGTH_LONG).show();
}
}
2022.05.23于长安