Net安卓app BroadcastReceiver 使用记录一坑

news2024/11/15 17:47:29

1.背景

由于项目需要,需要对接别的app的广播,就看了看Net 安卓开发的广播接收,看官网的介绍单纯广播和接收都挺简单的,于是上手样板项目弄了两个demo出来,app1用来发,app2用来收。

2.版本

:使用都是最新版对应安卓14,api34。

3.app1广播

广播为了方便测试,加了一个输入框和按钮,方便点击按钮发送广播查看效果。
app1广播代码:

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent"  
    android:orientation="vertical"  
    android:padding="16dp"  
    android:gravity="center_horizontal">  
  
    <EditText  
        android:id="@+id/inputText"  
        android:layout_width="200dp"  
        android:layout_height="wrap_content"  
        android:hint="请输入"  
        android:inputType="text"  
        android:layout_marginBottom="16dp" />  
  
    <Button  
        android:id="@+id/buttonSubmit"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:text="提交"  
        android:background="?android:attr/textColorPrimaryInverse"  
        android:textColor="@android:color/black"  
        android:layout_gravity="center_horizontal"  
        android:padding="10dp" />  
  
</LinearLayout>

MainActivity

protected override void OnCreate(Bundle? savedInstanceState)
{
    base.OnCreate(savedInstanceState);

    // Set our view from the "main" layout resource
    SetContentView(Resource.Layout.activity_main);

    // 获取布局中的控件  
    EditText inputText = FindViewById<EditText>(Resource.Id.inputText);
    Button buttonSubmit = FindViewById<Button>(Resource.Id.buttonSubmit);

    // 为按钮设置点击事件监听器  
    buttonSubmit.Click += (sender, e) => {
        // 获取输入框中的文本  
        string text = inputText.Text;
        // 在这里处理文本,例如显示一个Toast或者发送数据到服务器等  
        Toast.MakeText(this, "广播: " + text, ToastLength.Short).Show();
        BroadcastMessage(text);
    };
}

private void BroadcastMessage(string value)
{
    // 创建一个新的Intent对象  
    Intent intent = new Intent("test");

    //intent.SetPackage("com.companyname.AndroidApp2");
    //intent.SetComponent(new ComponentName("com.companyname.AndroidApp2", ".Receiver"));
    // 如果你想传递额外的数据,可以添加到Intent的Extras中  
    intent.PutExtra("key", value);

    // 发送广播  
    SendBroadcast(intent);//, "com.companyname.permissions.my_broadcast"
}

为了尝试这个广播接收淌了很多坑,像intent.SetPackage和intent.SetComponent发送的时候都不是必须指定的(新旧版本都不需要),唯一需要指定的就是new Intent(“test”)中的这个action。
到这里发送广播就完事了。

4.app2接收

MyReceiver

[BroadcastReceiver(Enabled = true, Exported = true)]
//[IntentFilter(new[] { "com.companyname.AndroidApp2.ReceiverFilter" })]
public  class MyReceiver : BroadcastReceiver
{
    public override void OnReceive(Context? context, Intent? intent)
    {
        
        if (intent != null)
        {
        	Log.Info("接收", intent.Action);
            var value = intent.GetStringExtra("key");
            Log.Info("接收", value.ToString());
        }
    }
}

MainActivity 中动态注册

 private MyReceiver _receiver;
 protected override void OnCreate(Bundle? savedInstanceState)
 {
     base.OnCreate(savedInstanceState);

     // Set our view from the "main" layout resource
     SetContentView(Resource.Layout.activity_main);

     _receiver = new MyReceiver();
 }
protected override void OnResume()
{
    base.OnResume();
    RegisterReceiver(_receiver, new IntentFilter("test"));
}

代码跟官网的没什么差别。
官网链接
但是问题就出现在用api34这里,运行后就直接报错提示Receive_Exported或者Receive_Not_Exported错误。

在 Android 应用中,广播接收器可以设置为“导出”(exported)或“非导出”(not exported)。导出意味着其他应用可以发送广播到这个接收器;非导出则意味着只有同一应用内部的组件可以发送广播到这个接收器。

看到这里我想的事难道Net版本的不同app之间不支持动态注册了吗(RegisterReceiver函数不像java中一样有参数可以控制exported),官网也没有通知。
于是改为静态注册,仍然失败:
AndroidManifest.xml

<application android:allowBackup="true" 
			 android:icon="@mipmap/appicon" 
			 android:label="@string/app_name" 
			 android:supportsRtl="true" 
			 android:theme="@android:style/Theme.Material.Light.DarkActionBar">
	<receiver android:name=".MyReceiver" android:exported="true" android:enabled="true" >
		--><!--android:permission="com.companyname.permissions.my_broadcast"-->
		<intent-filter>
			<action android:name="test"/>
		</intent-filter>
	</receiver>
</application>

之后翻看各种博文,浪费了一天多的时间,最后无奈之下打算用xamarin创建然后再升级(2024.5.1后不再支持xamarin,一条相当费劲的路)。

这里是解决这个问题的一个引子,创建的xamarin安卓应用要执行的时候发现Android SDK 支持不到34,最高只有33,
这里只建了一个接收,因为发送没有什么问题。
建立完后,执行,不错接收到了。

期间还尝试了Maui来建立,同样是失败的。

突然想到了33版本
在这里插入图片描述
就想着再试一下,不然真要费劲去升级了。
设置项目的AndroidManifest.xml文件里的uses-sdk的targetSdkVersion

<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="33" />

这里设置为了33,执行,没有报错,至少启动成功了。
然后开始广播,等待了一会接收到了,不用考虑升级了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1534795.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024格行VS华为VS飞猫哪个是最值得购买随身WiFi?中兴随身WiFi好用吗?

经常出差旅行&#xff0c;或者户外工作的朋友因为长期在外&#xff0c;手机流量经常不够用&#xff0c;想必都是随身WiFi的忠实用户&#xff0c;但是也都被这款产品割韭菜割的头皮发麻。今天&#xff0c;我们统计了市面上最靠谱的、最热销、口碑最好的几款随身WiFi。排名依据来…

查询表中数据(全列/特定列/表达式,where子句(比较/逻辑运算符),order by子句,limit筛选分页),mysql执行顺序

目录 select 全列查询 特定列查询 用表达式查询 (as) 名字 distinct 去重 where子句 比较运算符 列数据之间的比较 ​编辑 别名不能参与比较 null查询 between and in ( ... , ...) 模糊匹配 逻辑运算符 order by子句 可以使用别名 总结mysql执行顺…

【蓝桥杯选拔赛真题71】python判断字符 第十五届青少年组蓝桥杯python选拔赛真题 算法思维真题解析

目录 python判断字符 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、 推荐资料 1、蓝桥杯比赛 2、考级资料 3、其它资料 python判断字符 第十五届蓝桥杯青少年组python比赛选拔赛真题 一、题目要…

Google colab中如何从kaggle中接入数据?

写在前面 使用google colab进行数据分析和探索时&#xff0c;可引用的数据源包括但不限于&#xff1a;1.可上传的数据文件用本地加载的的方式打开数据资源&#xff1b;2.从网络链接中直接打开后加载到缓存中的文件资源&#xff1b;3.通过API或者外部的开放接口加载数据&#x…

软考 网络工程师 每日学习打卡 2024/3/21

学习内容 第8章 网络安全 本章主要讲解网络安全方面的基础知识和应用技术。针对考试应该掌握诸如数据加密、报文认 证、数字签名等基本理论&#xff0c;在此基础上深入理解网络安全协议的工作原理&#xff0c;并能够针对具体的 网络系统设计和实现简单的安全解决方案。 本章共有…

C语言之strsep用法实例(八十六)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

除了Confluence,有没有其他工具一样好用?

每个团队都需要一个协同工作工具&#xff0c;以更有效地管理任务、跟踪进度和分享知识。这就是Atlassian的Confluence发挥作用的地方。然而&#xff0c;尽管它相当强大&#xff0c;其昂贵的价格和复杂的界面可能会让某些用户望而却步。所以&#xff0c;还有其他工具可以替代Con…

面试算法-65-二叉树的层平均值

题目 给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 10-5 以内的答案可以被接受。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[3.00000,14.50000,11.00000] 解释&#xff1a;第 0 层的…

python中获取当前项目的目录

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂 今天介绍一下&#xff0c;如何在python中获取当前项目所在的目录&#xff0c;而不是运行脚本的目录。 class ProjectPaths:# 初始化时获取当前脚本的路径staticmethoddef get_script_dir():…

mysql数据库的索引管理

目录 一、索引的概述 1、索引的概念 2、索引的作用 3、索引的副作用 4、创建索引的原则依据 5、索引优化 6、索引的分类 7、数据文件与索引文件 二、管理数据库索引 1、查询索引 2、创建索引 2.1 创建普通索引 2.2 创建唯一索引 2.3 创建主键索引 2.4 创建组合…

java 方法重写

1、方法重写概述 重写发生在两个类中&#xff0c;这两个类必须有继承或实现关系。 子类中出现了和父类中一模一样的方法声明。这一模一样指的是什么&#xff1f; &#xff08;1&#xff09;方法名、返回值类型、参数&#xff08;个数、类型、顺序&#xff09;与父类一样&…

zabbix6.4报错问题汇总:zabbix server无法连接zabbix agent主机

在配置zabbix server连接本机agent时报错&#xff1a; Get value from agent failed: cannot connect to[[xxx.xxx.xxx.xxx]:10050]: [111] Connection refused 检查10050端口是否开放&#xff0c;以下三种方式都可以查看端口是否开放。 1.nc -zv <服务器IP> <端口号…

【十九】【算法分析与设计】加强训练

目录 杨辉三角 Fibonacci数列 The Biggest Water Problem 数字根&#xff1a; Digit Sum of N! 模的运算性质&#xff1a; [NOIP2005]谁拿了最多奖学金 牛牛的汉诺塔 结尾 杨辉三角 链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 时间…

嵌入式学习42-链表栈

链表栈知识体系 满增栈&#xff0c;满减栈&#xff0c;空增栈&#xff0c;空减栈 栈和队列的区别 释放P空间后&#xff0c;不要再次访问&#xff0c;会导致q 堆区的大小为10 链队列练习

windows11右键菜单改回windows10

问题 系统从Wondows10升级到了windows11&#xff0c;界面确实好看了一些&#xff0c;但是这个右键菜单让我想把电脑砸了&#xff0c;哪个设计师设计的反人类操作。 那能不能把windows11的右键菜单变回去呢&#xff0c;答案是可以的 解决步骤 按WinR打开运行输入【regedit】…

基于Springboot+Vue的医院管理系统

项目介绍 这是一个在线医院管理系统&#xff0c;使用Maven进行项目管理&#xff0c;基于springbootmybatis框架开发的项目&#xff0c;mysql底层数据库&#xff0c;前端采用VueElementPlus&#xff0c;redis缓存&#xff0c;作为初学springbootvue前后端分离架构的同学是一个很…

蓝桥杯 EDA 组 2023模拟+真题原理图解析

本文解析了标题内的原理图蓝桥杯EDA组真题&#xff0c;2021-2022 省赛真题/模拟题在上一篇文中。本文中重复或者是简单的电路节约篇幅不在赘述。 其中需要补充和计算原理图的题目解析都放在最下面 一、2023 年第十四届省赛模拟题1 1.1 Type-C 接口电路 通过 CH340N 将数据转化为…

扶贫惠农推介系统|基于jsp技术+ Mysql+Java+ B/S结构的扶贫惠农推介系统设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java&#xff0c;ssm&#xff0c;springboot的平台设计与实现项目系统开发资源&#xff08;可…

Qt学习--界面知识点大杂烩

在开发过程中&#xff0c;通常需要打开或者保存上位机数据到本地&#xff0c;这时候就需要用到

云主机搭建与服务软件部署

文章目录 登录访问云电脑与云电脑传输文件配置ssh服务ssh连接云电脑使用scp传输文件云端服务软件部署与实现外部访问首先购买云主机,以阿里云服务器 ECS为例子,官网购买就行了,选择默认安装了windows server 2022服务器系统 登录访问云电脑 购买完成进入控制台,能看到创建…