Android studio 动态广播注册接收
动态广播和静态广播的区别
1、静态广播在AndroidManifest.xml清单文件中注册:包名、过滤器、接收者。
动态广播在java代码中实现:new一个自定义广播MyBroadcastReceiver、new一个过滤器IntentFilter,注册接收者addAction(接收者:字符串类型),在Android14.0新的版本中registerReceiver(@Nullable BroadcastReceiver receiver, IntentFilter filter,int flags)flags需要指定,否则会闪退/报错,Context.RECEIVER_EXPORTED 表示可以接收应用外部广播,Context.RECEIVER_NOT_EXPORTED 应用内部广播。
2、静态广播可以实现应用没有启动时,可以接收到广播。动态广播只能在应用内部进行收发。
3、动态广播使用后需要自行销毁,一般在页面写在页面销毁方法中。
关键代码
动态注册
//注册动态广播
updataBroadcastReceiver = new UpdataBroadCastReceiver();//实例化自定义广播接收器
IntentFilter intentFilter = new IntentFilter();//过滤器
intentFilter.addAction("updata_Recevie");//过滤接收者
// registerReceiver(updataBroadcastReceiver,intentFilter);//在这里报错,如果没有try catch,会崩溃。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
//Android 14,api版本34,必须指定flags
//RECEIVER_EXPORTED 表示可以接收应用外部广播,ContextRECEIVER_NOT_EXPORTED 应用内部广播
//Android 14.0版本,关键在第3个参数,必须要有
registerReceiver(updataBroadcastReceiver, intentFilter, Context.RECEIVER_EXPORTED);
Log.d("wks","动态广播注册成功");
}
发送广播
//这里的方法和静态广播是一样的
Intent intent = new Intent("updata_Recevie");
Log.d("wks","动态广播已发送");
Toast.makeText(this, "动态广播已发送", Toast.LENGTH_SHORT).show();
intent.setPackage(getPackageName());//android8.0以上版本需要指定包名
//向广播接收者传递信息
intent.putExtra("value","我是洞幺,动态广播已发送,收到请回答");
//发送
sendBroadcast(intent);
接收广播
public class UpdataBroadCastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.e("wks","updata已响应,正在判断……");
if (intent.getAction().equals("updata_Recevie")){
String value = getStringExtra("value")
Log.e("wks",value);
Log.e("wks","动态广播接收器已获得指定数据");
}
}
}
实例代码
<!-activity_main.xml文件-->
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<Button
android:layout_width="250dp"
android:layout_height="60dp"
android:layout_marginLeft="30dp"
android:layout_marginTop="20dp"
android:text="updata_send"
android:textSize="20dp"
android:id="@+id/star_updata_send_bt"/>
</androidx.appcompat.widget.LinearLayoutCompat>
//新建广播接收器UpdataBroadCastReceiver.class,也可以直接写在主函数中
public class UpdataBroadCastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.e("wks","updata已响应,正在判断……");
if (intent.getAction().equals("updata_Recevie")){
String value = intent.getStringExtra("value");
Log.e("wks",value);
Log.e("wks","动态广播接收器已获得指定数据");
}
}
}
//MainActivity 程序入口
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button btn_updata_send;
//初始化
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//自定义的初始化方法
init();
}
//自定义的初始化方法
public void init() {
//注册动态广播
updataBroadcastReceiver = new UpdataBroadCastReceiver();//实例化自定义广播
IntentFilter intentFilter = new IntentFilter();//过滤器
intentFilter.addAction("updata_Recevie");//过滤接收者
// registerReceiver(updataBroadcastReceiver,intentFilter);//在这里报错,如果没有try catch,会崩溃
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {//Android studio帮忙添加的if
//Android 14,api版本34,必须指定flags
//RECEIVER_EXPORTED 表示可以接收应用外部广播,ContextRECEIVER_NOT_EXPORTED 应用内部广播
registerReceiver(updataBroadcastReceiver, intentFilter, Context.RECEIVER_EXPORTED);
Log.d("wks","动态广播注册成功");
}
btn_updata_send = (Button) findViewById(R.id.star_updata_send_bt);
btn_updata_send.setOnClickListener(this);
}
//当前Activity销毁是取消广播注册
@Override
protected void onDestroy() {
unregisterReceiver(updataBroadcastReceiver);
Log.d("wks", "广播已销毁");
super.onDestroy();
}
//按钮点击事件
@Override
public void onClick(View v) {
//新版本的api不能用switch……case判断按钮的id
if (v.getId()==R.id.star_updata_send_bt){
//这里的方法和静态广播是一样的
Intent intent = new Intent("updata_Recevie");
Log.d("wks","动态广播已发送");
Toast.makeText(this, "动态广播已发送", Toast.LENGTH_SHORT).show();
intent.setPackage(getPackageName());//android8.0以上版本需要指定包名
//向广播接收者传递信息
intent.putExtra("value","我是洞幺,动态广播已发送,收到请回答");
//发送
sendBroadcast(intent);
}
}
}