Xamarin.Android实现通知推送功能(1)

目录

  • 1、背景说明
    • 1.1 开发环境
    • 1.2 实现效果
      • 1.2.1 推送的界面
      • 1.2.2 推送的设置
      • 1.2.3 推送的功能实现
        • 1.2.3.1、`Activity`的设置【重要】
        • 1.2.3.2、代码的实现
  • 2、源码下载
  • 3、总结
  • 4、参考资料

1、背景说明

在App开发中,通知(或消息)的推送,是必须要有的功能。若在纯互联网的环境中,可以使用第三方的通知推送的功能,例如:小米推送、极光推送等,这个可以参考第三方的使用手册既可。但是在局域网中,例如医院内部的局域网中,则无法使用第三方的通知推送。因此在局域网环境中实现App通知推送的功能,就非常重要和关键。

本文将分为上下两部分。第一部分主要阐述Xamarin.Android的通知推送的功能实现。第二部分阐述如何在局域网环境下实现推送,并借助第一部分消息推送,从而实现整体的通知推送。

1.1 开发环境

使用VS2022社区版17.10.1,其中Xamarin为17.10.0.110

1.2 实现效果

Xamarin.Android中实现通知推送与Android基本一致。实现的效果如下:
在这里插入图片描述
图1 为主界面,点击右下角信封按钮,则系统会进行消息推送(主界面为:MainActivity
在这里插入图片描述
图2 系统收到推送后,在状态栏中弹出的推送内容
在这里插入图片描述
图3 当点击状态栏中的推送消息时,跳转到该推送的详细说明页面(即后续的NotificationDetailInfoActivity
在这里插入图片描述
图4 当在推送详细页面(NotificationDetailInfoActivity)点击返回按钮后,App返回至第二个Activity(即:SecondActivity
在这里插入图片描述
图5 在图4的界面上(即SecondActivity),点击返回按钮后,App返回至主界面(即MainActivity

1.2.1 推送的界面

在整个工程中,涉及到3个Activity:MainActivitySecondActivityNotificationDetailInfoActivity。如下图6所示
在这里插入图片描述
图6 工程涉及到的三个Activity

1.2.2 推送的设置

因为推送是在Activity中发生,所以需要再ActivityOnCreate方法中初始化通知设置NotificationChannel

private string CHANNEL_ID = "20000";
protected override void OnCreate(Bundle savedInstanceState)
{base.OnCreate(savedInstanceState);//初始化一个ChannelCreateNotificationChannel();
}void CreateNotificationChannel()
{if (Build.VERSION.SdkInt < BuildVersionCodes.O){// Notification channels are new in API 26 (and not a part of the// support library). There is no need to create a notification// channel on older versions of Android.return;}var channelName = Resources.GetString(Resource.String.second_channel_name);var channelDescription = GetString(Resource.String.second_channel_description);var channel = new NotificationChannel(CHANNEL_ID, channelName, NotificationImportance.Default){Description = channelDescription};var notificationManager = (NotificationManager)GetSystemService(NotificationService);notificationManager.CreateNotificationChannel(channel);
}

其中会涉及到Channel的名称和描述。也就是Resource.String.second_channel_nameResource.String.second_channel_description。这部分信息在Strings.xml中。具体如下:

<resources><string name="app_name">通知推送Demo</string><string name="action_settings">Settings</string><string name="channel_name">推送测试的名称</string><string name="channel_description">用于说明本推送的具体内容</string><string name="second_channel_name">第二个推送的名称</string><string name="second_channel_description">第二个用于说明推送的说明性文字(例如:本推送用于推送患者的用药服用信息!)</string>
</resources>

MainActivitySecondActivity中的OnCreate方法中都应用,因此效果如下
在这里插入图片描述
图7 在MainActivitySecondActivity设置通知后,可以在手机的通知界面看到这两个推送的设置
在这里插入图片描述
图8 这个是MainActivity中推送设置
在这里插入图片描述
图8 这个是SecondActivity中推送设置详细信息界面,可以看到标题和提示的内容

1.2.3 推送的功能实现

1.2.3.1、Activity的设置【重要】

若要设置返回时,按指定的顺序返回,则必须要设置ActivityParentActivity属性。在Android原生开发中,是在AndroidManifest.xml进行设置的。设置一般是这样子的:

<activity android:name=".MessageActivity"  android:parentActivityName=".MainActivity"/>

但是,在Xamarin.Android中,没法在AndroidManifest.xml设置,需要在Activity.cs中定义。

//在这儿设置******【重要】
[Activity(Label = "SecondActivity", ParentActivity = typeof(MainActivity))]
public class SecondActivity : Activity
{private TextView tvTitle;private string CHANNEL_ID = "20000";protected override void OnCreate(Bundle savedInstanceState){base.OnCreate(savedInstanceState);// Create your application hereCreateNotificationChannel();//设置推送的通知}....

这个地方是最特殊的地方,一定要注意。
在本项目中,将NotificationDetailInfoActivityParentActivity设为SecondActivity;而SecondActivityParentActivity设置为MainActivity

1.2.3.2、代码的实现

以上设置完成后,便可以在按钮的click方法中,实现消息的推送及实现,代码如下:

private void FabOnClick(object sender, EventArgs eventArgs)
{//View view = (View) sender;//Snackbar.Make(view, "Replace with your own action", Snackbar.LengthLong)//    .SetAction("Action", (View.IOnClickListener)null).Show();//第二步,在某个地方触发这个通知(此处是点击按钮)//点击推送通知后,要调用起来的ActivityIntent intent = new Intent(this, typeof(NotificationDetailInfoActivity));//传递的数据。也可以使用Bundle,可以搜索Bundle传值intent.PutExtra("message", "附加的详细信息,用于展示提示的具体内容!");//创建TaskStackBuilder,用于形成任务链,就是点击通知后,后续的返回界面等设置Android.App.TaskStackBuilder stackBuilder = Android.App.TaskStackBuilder.Create(this);//1、在Activity中设置ParentActivity属性。在Android的原生开发中,是在Manifest中设置,//但是在Xamarin中,需要直接在Activity中设置//2、直接调用AddNextIntentWithParentStack方法既可stackBuilder.AddNextIntentWithParentStack(intent);//网络上的设置,但在Xamarin中没有作用//stackBuilder.AddParentStack(Java.Lang.Class.FromType(typeof(MainActivity)));//stackBuilder.AddParentStack(Java.Lang.Class.FromType(typeof(SecondActivity)));//stackBuilder.AddNextIntent(intent);//设置PendingIntentconst int pendingIntentId = 0;PendingIntent pendingIntent =stackBuilder.GetPendingIntent(pendingIntentId, PendingIntentFlags.UpdateCurrent);NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID).SetContentIntent(pendingIntent).SetContentTitle("推送的标题内容") //1.SetContentText("推送的具体内容信息") //2.SetAutoCancel(true)  //设置自动取消.SetWhen(Java.Lang.JavaSystem.CurrentTimeMillis()).SetSmallIcon(Resource.Drawable.zl001);//调用通知Notification notification = builder.Build();NotificationManager notificationManager = GetSystemService(Context.NotificationService) as NotificationManager;const int notificationId = 1;notificationManager.Notify(notificationId, notification);
}

代码说明:
1、网上查找的资料(设置微软的官网上),在设置返回时,是如下面代码设置的。

//stackBuilder.AddParentStack(Java.Lang.Class.FromType(typeof(MainActivity)));
//stackBuilder.AddParentStack(Java.Lang.Class.FromType(typeof(SecondActivity)));
//stackBuilder.AddNextIntent(intent);

但在实际使用中,确是不起作用。在NotificationDetailInfoActivity界面,点击返回时,会返回至MainActivity,而不是按照指定的顺序进行。

因此直接使用了stackBuilder.AddNextIntentWithParentStack(intent);这句话。按自身的Stack顺序,进行返回。

2、PendingIntentFlags.UpdateCurrent标识位
这个标识位有很多,比较简单,使用比较多就是UpdateCurrent,大家可以自行查看资料

2、源码下载

源码已上传,正在审核中。若审核通过,将添加正式的连接地址

3、总结

第一部分主要讲述推送基本设置,推送设置中还有一些样式的设置,大家可以到官网上进行学习。
下一部分将讲述在局域网内实时实现消息的推送

4、参考资料

主要查看了官网微软官网和这篇博文。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jadx-gui-1.5 反编译工具使用教程 反混淆 Java android 查看签名

JADX&#xff1a;JADX是一个强大的反编译工具&#xff0c;它支持命令行和图形界面操作。除了基本的反编译功能外&#xff0c;JADX还提供了反混淆功能&#xff0c;有助于提高反编译后代码的可读性。 在Android开发和安全分析领域&#xff0c;反编译工具扮演着至关重要的角色。这…

HTML静态网页成品作业(HTML+CSS)—— 金宝贝儿童教育机构介绍网页(2个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有2个页面。 二、作品演示 三、代…

【数据分享】中国高技术产业统计年鉴(2023年)

大家好&#xff01;今天我要向大家介绍一份重要的高技术产业发展情况统计数据资源——《中国高技术产业统计年鉴》。这份年鉴涵盖了从2023年中国高技术产业发展情况的全面数据&#xff0c;并以多格式提供免费下载。&#xff08;无需分享朋友圈即可获取&#xff09; 数据介绍 …

离散数学答疑 3

&#xff5e;A&#xff1a;A的补集 有时候空集是元素&#xff0c;有时候就是纯粹的空集 A-B的定义&#xff1a; 笛卡尔积&#xff1a; 求等价关系&#xff1a;先求划分再一一列举 不同划分&#xff1a;分几块。一块&#xff1a;两块&#xff1a;三块&#xff1a;分别计算 Ix是…

LeetCode62不同路径

题目描述 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。问总共有多少条不同的路径&#xff1f; …

【Spring Cloud Alibaba】开源组件Sentinel

目录 什么是Sentinel发展历史与Hystrix的异同 Sentinel可以做什么&#xff1f;Sentinel的功能Sentinel的开源生态Sentinel的用户安装Sentinel控制台预备环境准备Sentinel 分为两个部分:下载地址 项目集成Sentinel创建项目修改依赖信息添加启动注解添加配置信息在控制器类中新增…

Django 里的表格内容做修改

当Django里表格内容需要做修改&#xff0c;可以这么操作。 先看效果图 修改后的表格 1. 先得在 asset_list.html 里修改。你们的html有可能跟我不一样 <table border"1px"><thead><tr><th>ID</th><th>标题</th><th…

九种mfc140u.dll丢失的解决方法,全面解决mfc140u.dll文件丢失

mfc140u.dll是 Microsoft Visual C 2015 Redistributable 的一部分&#xff0c;它与 Microsoft 基础类库&#xff08;MFC&#xff09;的 Unicode 版本有关。当您在运行使用 Visual C 2015 开发的应用程序时&#xff0c;可能会碰到关于mfc140u.dll丢失的错误。下面列出了一些解决…

探索k8s集群的配置资源(secret和configmap)

目录 ConfigMap ConfigMap&#xff08;主要是将配置目录或者文件挂载到k8s里面使用&#xff09; 与Secret类似&#xff0c;区别在于ConfigMap保存的是不需要加密配置的信息。&#xff08;例如&#xff1a;配置文件&#xff09; ConfigMap 功能在 Kubernetes1.2 版本中引入&…

Python深度学习基于Tensorflow(13)目标检测实战

文章目录 RPN 整体代码RPN 具体实现过程数据标注读取标注数据固定图片大小调整目标框使用预训练模型获取 feature_shape定义 RPN 网络生成RPN 的 CLS 和 REG 数据集获取所有的锚点计算锚点与目标框的IOU 定义 RPN loss 和 训练过程 参考资料 这里实现的是二阶段目标检测&#x…

Linux系统下 安装 Nginx

一、下载Nginx安装包 压缩包下载地址&#xff1a;nginx: download 服务器有外网&#xff0c;可直接使用命令下载 wget -c https://nginx.org/download/nginx-1.24.0.tar.gz 二、安装Nginx 1、解压 tar -zxvf nginx-1.24.0.tar.gz 2、安装Nginx所需依赖 yum install -y gc…

线性代数|机器学习-P1课程简介

文章目录 1. 书籍下载2. 正文 1. 书籍下载 链接&#xff1a;https://pan.baidu.com/s/1QbK0enLh0x4nU1c4Tqwlkw 提取码&#xff1a;r7ft 本课程回顾线性代数在概率论、统计学、优化和深度学习中的应用。是GILBERT STRANG教授的有一个经典的课程。课程将线性代数分为如下部分&a…

【第二节】C/C++数据结构之线性表

目录 一、线性表基本说明 1.1 基本概念 1.2 抽象数据类型 1.3 存储结构 1.4 插入与删除的区别 1.5 顺序存储和链式存储的优缺点 二、链表 2.1 基本概念 2.2 抽象数据类型 2.3 单链表的定义 2.4 单链表的基本操作 2.5 单链表模板形式的类定义与实现 三、单向循环链…

探索未来制造,BFT Robotics引领潮流

“买机器人&#xff0c;上BFT” 在这个快速变化的时代&#xff0c;创新和效率是企业发展的关键。BFT Robotics&#xff0c;作为您值得信赖的合作伙伴&#xff0c;专注于为您提供一站式的机器人采购和自动化解决方案。 产品系列&#xff1a; 协作机器人&#xff1a;安全、灵活、…

OpenShift 4 - OpenShift Service Mesh 3 预览

《OpenShift / RHEL / DevSecOps 汇总目录》 了解 OpenShift Service Mesh 3 的变化 OpenShift Service Mesh 是一套在 OpenShift 上安装部署、跟踪监控 Istio 运行环境的实现。红帽在 2023 年底推出了技术预览版的 OpenShift Service Mesh 3&#xff0c;它和目前的 OpenShif…

RERCS系统开发实战案例-Part01 快速启动面板创建新功能启动面板

需求背景&#xff1a;RERCS系统设计合同应收付比例调整界面&#xff0c;目的为合同与应收付款调整关联&#xff0c;保证数据的完整性与准确性。 步骤① 参数化快速启动板事务码 &#xff1a;LPD_CUST_PARAM 选择对应的角色与实例 可以看到系统中的快速启动面板菜单中已有的功能…

顶顶通呼叫中心中间件-asr录音路径修改(mod_cti基于FreeSWITCH)

顶顶通呼叫中心中间件-asr录音路径修改(mod_cti基于FreeSWITCH) 录音路径模板。如果不是绝对路径&#xff0c;会把这个路径追加到FreeSWITCH的recordings后面。支持变量&#xff0c;比如日期 ${strftime(%Y-%m-%d)}。最后一个录音文件路径会保存到变量 ${cti_asr_last_record_…

最大矩形问题

柱状图中最大的矩形 题目 分析 矩形的面积等于宽乘以高&#xff0c;因此只要能确定每个矩形的宽和高&#xff0c;就能计算它的面积。如果直方图中一个矩形从下标为 i 的柱子开始&#xff0c;到下标为 j 的柱子结束&#xff0c;那么这两根柱子之间的矩形&#xff08;含两端的柱…

Day45 代码随想录打卡|二叉树篇---路径总和

题目&#xff08;leecode T112&#xff09;&#xff1a; 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有节点值相加等于目标和 targetSum 。如果存在&#xff0c;返回 true &#xff1b;…

Docker搭建ELKF日志分析系统

Docker搭建ELKF日志分析系统 文章目录 Docker搭建ELKF日志分析系统资源列表基础环境一、系统环境准备1.1、创建所需的映射目录1.2、修改系统参数1.3、单击创建elk-kgc网络桥接 二、基于Dockerfile构建Elasticsearch镜像2.1、创建Elasticsearch工作目录2.2、上传资源到指定工作路…