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

news2024/10/5 17:20:09

目录

  • 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、参考资料

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

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

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

相关文章

CiteScore 2023发布,AI Open斩获45分,位列全球计算机领域前1%

与影响因子&#xff08;IF&#xff09;一样&#xff0c;引用分数&#xff08;CiteScore&#xff09;同样是衡量学术期刊影响力的重要指标之一&#xff0c;且大有赶超前者的势头。 6 月 6 日&#xff0c;CiteScore 2023 正式发布&#xff0c;人工智能领域可自由访问的期刊平台 …

塑造财务规划团队的未来角色

随着企业不断改革&#xff0c;其财务规划团队的格局也在不断变化&#xff0c;领先行业的专业人士已经开始利用更创新的财务知识和思维来驾驭现代化财务规划角色的复杂性。财务团队需要不同的职能角色和技能组合来支持其发展&#xff0c;多学科团队和跨职能协作带来的挑战和机遇…

刷代码随想录有感(95):合并区间

题干&#xff1a; 代码&#xff1a; class Solution { public:static bool cmp(vector<int>& a, vector<int>& b){return a[0] < b[0];}vector<vector<int>> merge(vector<vector<int>>& intervals) {sort(intervals.begi…

水务设备数字化管理

在数字化浪潮席卷全球的今天&#xff0c;水务行业也迎来了数字化转型的重要契机。传统水务管理模式中&#xff0c;设备监控、数据收集、运行维护等环节往往存在效率低下、成本高昂、安全隐患多等问题。而HiWoo Cloud平台的出现&#xff0c;以其强大的设备接入能力、高效的数据处…

安卓虚拟屏幕锁屏画面源码分析部分KeyguardPresentation

背景&#xff1a; 在搞虚拟多屏和投屏相关业务时候&#xff0c;发现在锁屏时候一个画面比较特殊&#xff0c;但是明显我们自己也没有给虚拟屏幕和投屏有绘制过这个页面。 具体页面如下&#xff1a; 这个圈中小方框就是虚拟屏幕&#xff0c;在息屏待机时候居然也有个类似锁屏…

【android 9】【input】【8.发送按键事件2——InputDispatcher线程】

系列文章目录 本人系列文章-CSDN博客 目录 系列文章目录 1.简介 1.1流程介绍 1.2 时序图 2.普通按键消息发送部分源码分析&#xff08;按键按下事件&#xff09; 2.1 开机后分发线程阻塞的地方 2.2 InputDispatcher::dispatchOnceInnerLocked 2.3 InputDispatcher::disp…

从零开始手把手Vue3+TypeScript+ElementPlus管理后台项目实战四(引入Axios,并调用第一个接口)

RealWorld接口综述 本项目调用的是RealWorld项目的开放接口。 接口文档如下&#xff1a; https://main--realworld-docs.netlify.app/docs/specs/backend-specs/endpoints https://main--realworld-docs.netlify.app/docs/specs/frontend-specs/swagger RealWorld 是一个适…

GAT1399协议分析(10)--单图像删除

一、官方接口 由于批量删除的接口,图像只能单独删除。 二、wireshark实例 这个接口比较简单,调用request delete即可 文本化: DELETE /VIID/Images/34078100001190001002012024060513561300065 HTTP/1.1 Host: 10.0.201.56:31400 User-Agent: python-requests/2.32.3 Acc…

推荐ChatGPT4.0——Code Copilot辅助编程、Diagrams: Show Me绘制UML图、上传PDF并阅读分析

5月14日凌晨1点、太平洋时间的上午 10 点&#xff0c;OpenAI的GPT-4o的横空出世&#xff0c;再次巩固了其作为行业颠覆者的地位。GPT-4o的发布不仅仅是一个产品的揭晓&#xff0c;它更像是向世界宣告AI技术已迈入了一个全新的纪元&#xff0c;连OpenAI的领航者萨姆奥特曼也不禁…

Redis客户端界面工具QuickRedis

介绍 QuickRedis 是一款 永久免费 的 Redis 可视化管理工具。它支持直连、哨兵、集群模式&#xff0c;支持亿万数量级的 key&#xff0c;还有令人兴奋的 UI。QuickRedis 支持 Windows 、 Mac OS X 和 Linux 下运行。 QuickRedis 是一个效率工具&#xff0c;当别人在努力敲命令…

代码随想录第27天|贪心算法part1

455.分发饼干 先给孩子和饼干排序&#xff0c;每次选取一个最大的饼干给一个最大胃口的孩子&#xff0c;直到饼干分完或者遍历完孩子 class Solution { public:int findContentChildren(vector<int>& g, vector<int>& s) {sort(g.begin(), g.end());sort(…

【vector模拟实现】附加代码讲解

vector模拟实现 一、看源代码简单实现1. push_backcapacity&#xff08;容量&#xff09;sizereserve&#xff08;扩容&#xff09;operator[ ] &#xff08;元素访问&#xff09; 2. pop_back3. itorator&#xff08;迭代器&#xff09;4.insert & erase &#xff08;头插…

逻辑过期解决缓存击穿

我先说一下正常的业务流程&#xff1a;需要查询店铺数据&#xff0c;我们会先从redis中查询&#xff0c;判断是否能命中&#xff0c;若命中说明redis中有需要的数据就直接返回&#xff1b;没有命中就需要去mysql数据库查询&#xff0c;在数据库中查到了就返回数据并把该数据存入…

设置密码重要性!美国一配件制造商因忘设密码影响50 多万客户

1、Cox Biz 身份验证绕过漏洞使数百万台设备暴露于接管 美国一家领先宽带提供商cox的基础架构中存在 API 授权绕过漏洞&#xff0c;如果被利用攻击者不仅可以访问企业客户的个人身份信息 &#xff08;PII&#xff09;&#xff0c;还可以访问 Wi-Fi 密码和连接设备上的信息&…

代码随想录算法训练营Day17|404.左叶子之和 110.平衡二叉树 222.完全二叉树的节点个数

404.左叶子之和 1、这道题需要统计出所有左叶子结点的值的和&#xff0c;首先要明确左叶子节点指的左右孩子节点均为null的左节点。如上图就是4和6. 2.但是光凭叶子结点本身是无法判定左叶子的&#xff0c;因为左右孩子都是null&#xff0c;所以要从上一层节点往下判定。所以判…

华为RH2288H V3服务器iBMC的SSL证书续期

本文对华为RH2288H V3服务器iBMC的SSL证书续期&#xff0c;以避名登录告警提示及主机状态异常。 一、检查现网服务器iBMC的SSL证书到期时间 登录iBMC&#xff0c;点击配置--SSL证书&#xff0c;如下&#xff1a; 可以看到本服务器SSL证书将于今年7月22日到期。 二、联系厂家…

ui自动化中,鼠标操作

from selenium.webdriver import ActionChainsaction ActionChains(driver) # 然后把driver作为参数&#xff0c;实例化一个action对象 练习地址&#xff1a;https://sahitest.com/demo/ 悬停例子&#xff08;百度首页&#xff09; action.move_to_element(ele).perfor…

Cognita RAG:模块化、易用与可扩展的开源框架

Cognita RAG是一个开源框架&#xff0c;它通过模块化设计、用户友好的界面和可扩展性&#xff0c;简化了将领域特定知识整合到通用预训练语言模型中的过程。本文介绍了Cognita的特点、优势、应用场景以及如何帮助开发者构建适合生产环境的RAG应用程序。 文章目录 Cognita RAG介…

HTML基本元素包含HTML表单验证

可将以下代码复制另存为一个HTML文件浏览器打开自己去看看实际使用效果 <!DOCTYPE html> <html> <head> <meta charset"utf-8"><title>测试</title> </head> <body> <h1>很多事</h1> <h1><b&…

【问题分析】WMS无焦点窗口的ANR问题 + transientLaunch介绍【Android 14】

问题描述 Monkey跑出的Camera发生ANR的问题&#xff0c;其实跟Camera无关&#xff0c;任意一个App都会在此场景下发生ANR&#xff0c;场景涉及到Launcher的RecentsActivity界面&#xff0c;和transientLaunch相关。 1 log分析 看问题发生的场景&#xff1a; 1、Camera App的…