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);
    //初始化一个Channel
    CreateNotificationChannel();
}


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 here
        CreateNotificationChannel();//设置推送的通知
    }
    ....

这个地方是最特殊的地方,一定要注意。
在本项目中,将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();

    //第二步,在某个地方触发这个通知(此处是点击按钮)
    //点击推送通知后,要调用起来的Activity
    Intent 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);

    //设置PendingIntent
    const 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、参考资料

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

k8s小型实验模拟

&#xff08;1&#xff09;Kubernetes 区域可采用 Kubeadm 方式进行安装。&#xff08;5分&#xff09; &#xff08;2&#xff09;要求在 Kubernetes 环境中&#xff0c;通过yaml文件的方式&#xff0c;创建2个Nginx Pod分别放置在两个不同的节点上&#xff0c;Pod使用hostPat…

Gradio 案例——将文本文件转为词云图

文章目录 Gradio 案例——将文本文件转为词云图界面截图依赖安装项目目录结构代码 Gradio 案例——将文本文件转为词云图 利用 word_cloud 库&#xff0c;将文本文件转为词云图更完整、丰富的示例项目见 GitHub - AlionSSS/wordcloud-webui: The web UI for word_cloud(text t…

AI产品经理岗位需求量大吗?好找工作吗?

前言 在当今这个科技日新月异的时代&#xff0c;人工智能&#xff08;AI&#xff09;已不再仅仅是一个遥远的概念&#xff0c;而是深深嵌入到我们生活的方方面面&#xff0c;从日常的语音助手到复杂的自动驾驶系统&#xff0c;AI的触角无处不在。随着AI技术的广泛应用和持续进…

kettle列转行(行扁平化)的使用

kettle行扁平化节点是将多行数据合并为一行数据如&#xff0c;其行为类似于css中的float排列 将上表格数据转换为下表格数据 namecategorynumjack语文10jack数学20jack英语40rose英语50 name语文数学英语jack102040rose50 使用行扁平化节点配置需要扁平化的字段&#xff0c…

泛微开发修炼之旅--09Ecology作为所有异构系统的待办中心,实现与kafka对接源码及示例

文章链接&#xff1a;泛微开发修炼之旅--09Ecology作为所有异构系统的待办中心&#xff0c;实现与kafka对接源码及示例

龙迅LT6911GX HDMI 2.1桥接到四 PORT MIPI或者LVDS,支持图像处理以及旋转,内置MCU以及LPDDR4

龙迅LT6911GX描述&#xff1a; LT6911GX是一款高性能的HDMI2.1到MIPI或LVDS芯片&#xff0c;用于VR/显示器应用。HDCP RX作为HDCP中继器的上游端&#xff0c;可以与其他芯片的HDCP TX协同工作&#xff0c;实现中继器的功能。对于HDMI2.1输入&#xff0c;LT6911GX可配置为3/4车…

JavaScript的核心语法

JavaScript JavaScript&#xff1a;JavaScript的组成&#xff1a;核心语法&#xff1a;Hello&#xff1a;变量&#xff1a;JS的基本数据类型&#xff1a;特殊点&#xff1a; 数组&#xff1a;流程控制语句&#xff1a;函数&#xff1a;函数的重载&#xff1a;函数的递归:预定义…

python-windows10普通笔记本跑bert mrpc数据样例0.1.001

python-windows10普通笔记本跑bert mrpc数据样例0.1.000 背景参考章节获取数据下载bert模型下载bert代码windows10的cpu执行结果注意事项TODOLIST背景 看了介绍说可以在gpu或者tpu上去微调,当前没环境,所以先在windows10上跑一跑,看是否能顺利进行,目标就是训练的过程中没…

WWDC24即将到来,ios18放大招

苹果公司即将在下周开全球开发者大会(WWDC)&#xff0c;大会上将展示其人工智能技术整合到设备和软件中的重大进展,包括与OpenAI的历史性合作。随着大会的临近,有关iOS 18及其据称采用AI技术支持的应用程序和功能的各种泄露信息已经浮出水面。 据报道,苹果将利用其自主研发的大…

WPF国际化的最佳实践

WPF国际化的最佳实践 1.创建项目资源文件 如果你的项目没有Properties文件夹和Resources.resx文件&#xff0c;可以通过右键项目-资源-常规-添加创建或打开程序集资源 2.添加国际化字符串 打开Resources.resx文件&#xff0c;添加需要翻译的文本字符&#xff0c;并将访问修…

深入了解 Postman 中的变量

在我们进行 API 开发和测试时&#xff0c;使用诸如 Postman 之类的工具可以极大地简化工作流程&#xff0c;提高效率。Postman 的一个强大功能就是变量&#xff08;Variables&#xff09;。利用变量&#xff0c;我们可以使我们的请求变得更加动态和灵活&#xff0c;避免重复输入…

计算机组成实验---Cache的实现

直接映射 先看懂cache的映射原理&#xff0c;根据cache大小与主存大小来计算各个信号线的位数 各个信号线位数 主存地址在逻辑上分为区号、块号、块内地址 Cache结构 Cache访问原理 基本过程 状态机&#xff1a;“三段式”实现 6.3 Verilog 状态机 | 菜鸟教程 (runoob.com) …

问题:当频点数大于载波数时,() #学习方法#知识分享

问题&#xff1a;当频点数大于载波数时&#xff0c;&#xff08;&#xff09; A.基带跳频可以执行&#xff0c;混合跳频可以执行 B.基带跳频不可以执行&#xff0c;混合跳频可以执行 C.基带跳频可以执行&#xff0c;混合跳频不可以执行 D.基带跳频不可以执行&#xff0c;混…

2024-06-07 Unity 编辑器开发之编辑器拓展8 —— Scene 窗口拓展

文章目录 1 Handles 类1.1 Scene 响应函数1.2 自定义窗口中监听 Scene1.3 Handles 常用 API2.2.1 颜色控制2.2.2 文本2.2.3 线段2.2.4 虚线2.2.5 圆弧2.2.6 圆2.2.7 立方体2.2.8 几何体2.2.9 移动、旋转、缩放2.2.10 自由移动 / 旋转 2 Scene 窗口中显示 GUI3 HandleUtility4 G…

React 18

创建 React 18 脚手架项目 全局安装 create-react-app npm install -g create-react-app yarn global add create-react-app . 确认是否已安装 create-react-app npm list -g create-react-app yarn global list | grep create-react-app . 如果安装失败 有时&#xff0…

YOLOv8---seg实例分割(制作数据集,训练模型,预测结果)

YOLOv8----seg实例分割&#xff08;制作数据集&#xff0c;训练模型&#xff0c;预测结果&#xff09; 内容如下&#xff1a;【需要软件及工具&#xff1a;pycharm、labelme、anaconda、云主机&#xff08;跑训练&#xff09;】 1.制作自己的数据集 2.在yolo的预训练模型的基础…

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…

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

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

[职场] 项目实施工程师的工作前景 #笔记#经验分享

项目实施工程师的工作前景 项目实施工程师是负责将软件产品或解决方案实施到客户现场并确保项目成功落地的工作岗位。他们要负责整个项目的规划、组织、执行和控制&#xff0c;确保项目按照预定的进度、质量和预算完成。 一&#xff0e;工作内容 1. 项目规划&#xff1a;确定…

docker部署fastdfs

我的镜像包地址 链接&#xff1a;https://pan.baidu.com/s/1j5E5O1xdyQVfJhsOevXvYg?pwdhcav 提取码&#xff1a;hcav docker load -i gofast.tar.gz拉取gofast docker pull sjqzhang/go-fastdfs启动gofast docker run -d --name fastdfs -p 8080:8080 -v /opt/lijia/lijia…