SignalR+HTML5实现消息推送及Android通知栏消息

最近在研究使用SignalR实现跨平台的消息中心,WebAPI+SignalR作为数据接口和消息中心,客户端包含WPF桌面应用、Web应用和Android移动应用。这其中关键的功能点在于接收到实时消息后的通知提醒,桌面应用和Web应用实现相对简单,Android移动应用开发由于没有相关经验所以花费了一些时间。


开发环境

环境版本
操作系统Windows 10 proffesional
编译器HBuilder8.8.0
编译器Eclipse
测试环境Android4.2/7.0

服务端

服务端的开发有了前面的经验已经驾轻就熟了,包含三个简单方法:上线提醒、下线提醒、消息发送,代码如下:

    public class MessageHub : Hub
    {
        public override Task OnConnected()
        {
            Clients.Others.listen("[" + DateTime.Now.ToString("yyyy/MM/dd hh:mm:ss") + "]:" + Context.ConnectionId + ",上线了!");
            return base.OnConnected();
        }
        public override Task OnDisconnected(bool stopCalled)
        {
            Clients.Others.listen("[" + DateTime.Now.ToString("yyyy/MM/dd hh:mm:ss") + "]:" + Context.ConnectionId + ",下线了!");

            return base.OnDisconnected(stopCalled);
        }
        public async Task Welcome(string name)
        {
            string message = "[" + Context.ConnectionId + "][" + System.DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss") + "]:" + name;
            await Clients.All.listen(message);
        }
    }

详细的代码可以参考以前的博文

WebAPI集成SignalR

Android客户端

Android客户端采用HTML5开发,一方面是考虑和Web端的通用性,另一方面是因为本人不会原生Android开发。Android客户端处理过程如下:与服务端建立连接,监听消息,接收消息,创建通知。

SignalR JS客户端发送/接收消息

SignalR的JavaScript客户端代码在网上很多,具体原理和配置不再啰嗦。由于编译器使用的是HBuilder(基于Eclipse开发),就使用了它自带的MUI框架,省去了界面设计的麻烦。
创建一个MUI框架的移动应用项目:
这里写图片描述
需要注意的是,MUI和JQuery的通配符   符号给JQuery使用,MUI的$全部使用mui代替。
引用SignalR的js类库:

    <script src="js/mui.min.js"></script>
    <script type="text/javascript" src="js/jquery-1.6.4.min.js" ></script>
    <script type="text/javascript" src="js/jquery.signalR-2.2.2.min.js" ></script>
    <script type="text/javascript" src="js/common.js" ></script>
    <link href="css/mui.min.css" rel="stylesheet"/>

HTML界面:

<body>
    <div>
        <input type="button" id="_start" value="打开连接" />
        <input type="button" id="_stop" value="断开连接" />
        <input type="button" id="_clear" value="清空记录" />
    </div>
    <div>
        <ul id="_messageList"></ul>
    </div>
    <form class="mui-input-group">
        <div class="mui-input-row">
            <input type="text" id='_msg' placeholder="请输入">
        </div>
        <div class="mui-button-row">
            <input type="button" id='_send' value="发送"/>
        </div>
    </form>
</body>

js代码:

    <script type="text/javascript" charset="utf-8">
        mui.init();

            mui.plusReady(function () {
            var startBtn = $('#_start');
            var stopBtn = $('#_stop');
            var listener = $.hubConnection('http://192.168.1.100/MessageBus',{ useDefaultPath: false });
            var hub=listener.createHubProxy('MessageHub');

            enable(stopBtn, false);
            enable(startBtn, true);

            //启动
            startBtn.click(function () {
                startConnection();
                enable(stopBtn, true);
                enable(startBtn, false);
            });

            //停止
            stopBtn.click(function () {
                stopConnection();
                enable(startBtn, true);
                enable(stopBtn, false);
            });

            //清空列表
            $('#_clear').click(function () {
                $('#_messageList').children().remove();
            });

            //开启连接
            function startConnection() {
                hub.on('listen',function (message) {

                    $('#_messageList').append('<li>' + message + '</li>'); 
                });

                listener.start().fail(function () {
                    $('#_messageList').append('<li>打开连接失败!</li>');
                }).done(function () {
                    $('#_messageList').append('<li>连接已打开...</li>');
                });

            }

            //断开连接
            function stopConnection() {
                listener.stop();
                $('#_messageList').append('<li>连接已断开...</li>');
            };

            //按钮切换
            function enable(button,enabled) {
                if (enabled) {
                    button.removeAttr("disabled");
                }
                else {
                    button.attr("disabled", "disabled");
                }
            }
            //发送消息
            $('#_send').click(function(){
                var msg=$('#_msg').val();
                hub.invoke('Welcome',msg);
                $('#_msg').val('');
            });       
     });

    </script>

实现效果:
这里写图片描述

使用Native.js创建Android通知栏消息

Native.js实际上是HTML5标准的一部分,并不是一门语言,能够将手机操作系统的原生对象转义,映射为JS对象,简单讲就是使用js操控手机操作系统。有了Native.js,对于像我这样的.NET程序员开发手机应用是再好不过了。
根据查找的资料编写了一段用来创建通知栏消息的代码:

            function CreateNotification(m,n){
                var NotifyID = n;
                var Context = plus.android.importClass("android.content.Context");
                var main = plus.android.runtimeMainActivity();
                var Noti = plus.android.importClass("android.app.Notification");
                var NotificationManager = plus.android.importClass("android.app.NotificationManager");
                var nm = main.getSystemService(Context.NOTIFICATION_SERVICE)
                var Notification = plus.android.importClass("android.app.Notification");
                var mNotification = new Notification.Builder(main);
                var pending=plus.android.importClass("android.app.PendingIntent");
                var intent=plus.android.importClass("android.content.Intent");

                //mNotification.setOngoing(true);
                mNotification.setContentTitle("您有一条未读消息");//标题
                mNotification.setContentText(m);//内容
                mNotification.setSmallIcon(17301620);//图标
                mNotification.setTicker("First Time");//通知首次出现在通知栏时的效果
                mNotification.setNumber(5);//通知集合的数量
                //var str = dateToStr(new Date());
                //mNotification.setWhen(str);//通知产生时间
                //mNotification.setContentIntent();//通知栏点击事件
                mNotification.setDefaults(Noti.DEFAULT_VIBRATE);//声音、闪灯、震动效果,可叠加
                mNotification.setPriority(Noti.PRIORITY_DEFAULT);//通知优先级
                mNotification.flags=Notification.FLAG_ONLY_ALERT_ONCE;//发起通知时震动
                var mNb = mNotification.build()
                nm.notify(NotifyID , mNb);
            }

两个参数分别代表通知内容和通知编号,其他设置已经在代码注释中说明。结合上一部分的代码,在接收到实时消息后,创建通知栏消息,代码修改如下:

            var i=0;

            //开启连接
            function startConnection() {
                hub.on('listen',function (message) {

                    $('#_messageList').append('<li>' + message + '</li>'); 
                    i=i+1;
                    CreateNotification(message,i);
                });

                listener.start().fail(function () {
                    $('#_messageList').append('<li>打开连接失败!</li>');
                }).done(function () {
                    $('#_messageList').append('<li>连接已打开...</li>');
                });

            }

实现效果如下:
这里写图片描述

备注

测试时使用了两部手机、一台服务器,均位于同一局域网内。后将服务端部署到公网测试服务器上,同样可用。必须将SignalR服务端启用跨域访问,否则无法实现功能。


作为一个会一点点JS的.NET程序员,只是实现了最基本的需求,后期还要继续实现点击通知打开应用等功能。欢迎大家前来探讨,不吝赐教!

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Android通知是用来显示推送消息的重要组件之一。要在Android应用中实现通知推送消息,你需要进行以下步骤: 1. 创建通知渠道:从Android 8.0(API级别26)开始,你需要创建通知渠道来管理和组织通知。使用NotificationChannel类来创建通知渠道,并设置其名称、描述和重要性级别等参数。 2. 构建通知内容:使用NotificationCompat.Builder类来构建通知的内容,包括标题、文本、图标、大图等。 3. 设置点击行为:可以为通知设置点击行为,比如打开应用的某个界面或执行特定的操作。使用PendingIntent类来定义点击通知时要执行的动作。 4. 发送通知:通过NotificationManager类的notify()方法发送通知。指定一个唯一的通知ID以及之前创建的NotificationCompat.Builder对象。 下面是一个示例代码,演示了如何发送一个简单的通知: ```java // 创建通知渠道 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { NotificationChannel channel = new NotificationChannel("channel_id", "Channel Name", NotificationManager.IMPORTANCE_DEFAULT); channel.setDescription("Channel Description"); // 在NotificationManager中创建通知渠道 NotificationManager notificationManager = getSystemService(NotificationManager.class); notificationManager.createNotificationChannel(channel); } // 构建通知内容 NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "channel_id") .setSmallIcon(R.drawable.notification_icon) .setContentTitle("Notification Title") .setContentText("Notification Text") .setPriority(NotificationCompat.PRIORITY_DEFAULT) .setContentIntent(pendingIntent) // 设置点击行为 .setAutoCancel(true); // 点击后自动取消通知 // 发送通知 NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this); notificationManager.notify(notificationId, builder

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值