广播注册的三者方式
1.动态注册广播
动态接收的广播多数情况下是内部类,这样子可以操作外部类。
①. //注册广播
//第一步,创建意图过滤器(对外部事件进行过滤,只对感兴趣的外部事件(如当电话呼入时,或者数据网络可用时)进行接收并做出响应)
IntentFilter intentFilter = new IntentFilter();
//第二步,添加要监听的广播action(设置频道)
intentFilter.addAction(Intent.ACTION_BATTERY_CHANGED);
intentFilter.addAction(Intent.ACTION_SCREEN_ON);
//第三步,实例化广播接收者,并且设置成成员变量,以便于取消注册,释放资源
BatteryLevelReceiver batteryLevelReceiver = new BatteryLevelReceiver();
//第四步,注册广播接收者
this.registerReceiver(batteryLevelReceiver, intentFilter);
②. 创建一个广播接收者,继承自BroadcastReceiver(),内部类.
getAction()得到频道内监听的内容。通过intent意图接受信息。
③.广播取消注册(不用时)batteryLevelReceiver已经为外部成员变量
protected void onDestroy() {
super.onDestroy();
//取消注册,否则会导致内存泄露
if(batteryLevelReceiver != null){
this.unregisterReceiver(batteryLevelReceiver);
batteryLevelReceiver = null;
}
}
2.静态注册广播
①注册方式:在AndroidManifest里进行注册
首先在Application节点里头,添加一个receiver节点。name则是广播接收者
②.设置广播接收
创建一个广播接收者,继承自BroadcastReceiver(),内部类.
getAction()得到频道内监听的内容。通过intent意图接受信息。
③.不需要进行取消注册,会一直进行广播接受。
静态配置监听应用的卸载与安装:
AndroidManifest.xml的配置
静态注册和动态注册的区别:
静态注册可以一直监听着,即使应用没有起来,也可以监听着,但是耗资源,长期监听着。
静态注册的广播优先级高于动态注册的广播。
动态注册的优点就是省资源,需要的时候才监听,不需要的时候需要取消注册。
3.自定义广播
1)自定义动态注册广播
1.注册广播
//注册广播
IntentFilter filter = new IntentFilter();
//增加Action(与隐式广播不同)
filter.addAction("com.example.qqlogindemo.POST_LETTER");
//实例化监听对象
broadCast = new BroadCast();
//注册
this.registerReceiver(broadCast,filter);
2.设置广播内容发送:(发送对象也是放在intent发送,获取得先得到intent.getParcelableExtra())
private void IntentPost() {
String postText = post.getText().toString().trim();
Intent intent = new Intent();
intent.setAction("com.example.qqlogindemo.POST_LETTER");
intent.putExtra("postMsg",postText);
//广播发射
sendBroadcast(intent);
Log.d(TAG,"发射");
}
3.广播销毁:
@Override
protected void onDestroy() {
super.onDestroy();
if(broadCast != null){
this.unregisterReceiver(broadcast);
broadCast = null;
}
}
2)在另一个监听器中:BroadCast.java(继承BroadcastReceiver)
1.监听广播:(不需要进行注册)
public class BroadCast extends BroadcastReceiver{
private static final String TAG = "BroadCast";
@Override
public void onReceive(Context context, Intent intent) {
//获取监听内容
String action = intent.getAction();
Log.d(TAG,"action->>"+action);
String postMsg = intent.getStringExtra("postMsg");
Log.d(TAG,"信息内容为:"+postMsg);
}
}
完整流程:
PostLetter.java
public class PostLetter extends Activity implements View.OnClickListener {
private static final String TAG = "PostReceiver";
private Button postBtn;
private EditText post;
private BroadCast broadCast;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.receiver);
InitVeiw();
InitLinstener();
//注册广播
IntentFilter filter = new IntentFilter();
//增加Action(与隐式广播不同)
filter.addAction("com.example.qqlogindemo.POST_LETTER");
//实例化监听对象
broadCast = new BroadCast();
//注册
this.registerReceiver(broadCast,filter);
}
private void InitVeiw() {
postBtn = this.findViewById(R.id.post_btn);
post = this.findViewById(R.id.post_text);
}
private void InitLinstener() {
postBtn.setOnClickListener(this);
}
@Override
public void onClick(View v) {
//将数据广播出去
IntentPost();
}
private void IntentPost() {
String postText = post.getText().toString().trim();
Intent intent = new Intent();
intent.setAction("com.example.qqlogindemo.POST_LETTER");
intent.putExtra("postMsg",postText);
//广播发射
sendBroadcast(intent);
Log.d(TAG,"发射");
}
@Override
protected void onDestroy() {
super.onDestroy();
if(broadCast != null){
this.unregisterReceiver(broadCast);
broadCast = null;
}
}
}
BroadCast,java(监听器)
public class BroadCast extends BroadcastReceiver{
private static final String TAG = "BroadCast";
@Override
public void onReceive(Context context, Intent intent) {
//获取监听内容
String action = intent.getAction();
Log.d(TAG,"action->>"+action);
String postMsg = intent.getStringExtra("postMsg");
Log.d(TAG,"信息内容为:"+postMsg);
}
}
运行截图:
==================================================================
以上内容根据b站up主程序猿拉大锯学习整理
供自己学习使用