Android studio 动态广播注册接收

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);
        }
    }
}

运行效果

在这里插入图片描述

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值