android即时通讯保活,使用Android WebSocket实现即时通讯功能(2)_ShuYini的博客-程序员秘密

技术标签: android即时通讯保活  

ws:// ip地址 : 端口号

连接时可以使用connect()方法或connectBlocking()方法,建议使用connectBlocking()方法,connectBlocking多出一个等待操作,会先连接再发送。

try {

client.connectBlocking();

} catch (InterruptedException e) {

e.printStackTrace();

}

运行之后可以看到客户端的onOpen()方法得到了执行,表示已经和websocket建立了连接

b974265317a5ef07f1ded17838d09a4f.png

5、发送消息

发送消息只需要调用send()方法,如下

if (client != null && client.isOpen()) {

client.send("你好");

}

6、关闭socket连接

关闭连接调用close()方法,最后为了避免重复实例化WebSocketClient对象,关闭时一定要将对象置空。

/**

* 断开连接

*/

private void closeConnect() {

try {

if (null != client) {

client.close();

}

} catch (Exception e) {

e.printStackTrace();

} finally {

client = null;

}

}

二、后台运行

一般来说即时通讯功能都希望像QQ微信这些App一样能在后台保持运行,当然App保活这个问题本身就是个伪命题,我们只能尽可能保活,所以首先就是建一个Service,将websocket的逻辑放入服务中运行并尽可能保活,让websocket保持连接。

1、新建Service

新建一个Service,在启动Service时实例化WebSocketClient对象并建立连接,将上面的代码搬到服务里即可。

2、Service和Activity之间通讯

由于消息是在Service中接收,从Activity中发送,需要获取到Service中的WebSocketClient对象,所以需要进行服务和活动之间的通讯,这就需要用到Service中的onBind()方法了。

首先新建一个Binder类,让它继承自Binder,并在内部提供相应方法,然后在onBind()方法中返回这个类的实例。

public class JWebSocketClientService extends Service {

private URI uri;

public JWebSocketClient client;

private JWebSocketClientBinder mBinder = new JWebSocketClientBinder();

//用于Activity和service通讯

class JWebSocketClientBinder extends Binder {

public JWebSocketClientService getService() {

return JWebSocketClientService.this;

}

}

@Override

public IBinder onBind(Intent intent) {

return mBinder;

}

}

接下来就需要对应的Activity绑定Service,并获取Service的东西,代码如下

public class MainActivity extends AppCompatActivity {

private JWebSocketClient client;

private JWebSocketClientService.JWebSocketClientBinder binder;

private JWebSocketClientService jWebSClientService;

private ServiceConnection serviceConnection = new ServiceConnection() {

@Override

public void onServiceConnected(ComponentName componentName, IBinder iBinder) {

//服务与活动成功绑定

Log.e("MainActivity", "服务与活动成功绑定");

binder = (JWebSocketClientService.JWebSocketClientBinder) iBinder;

jWebSClientService = binder.getService();

client = jWebSClientService.client;

}

@Override

public void onServiceDisconnected(ComponentName componentName) {

//服务与活动断开

Log.e("MainActivity", "服务与活动成功断开");

}

};

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

bindService();

}

/**

* 绑定服务

*/

private void bindService() {

Intent bindIntent = new Intent(MainActivity.this, JWebSocketClientService.class);

bindService(bindIntent, serviceConnection, BIND_AUTO_CREATE);

}

}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_35958783/article/details/117639734

智能推荐

[MIMO-OFDM通信系统的频谱效率matlab仿真] -- MATLAB仿真MIMO-OFDM通信系统的频谱利用效率_ofdm通信系统matlab_code_kd的博客-程序员秘密

频谱效率是评价通信系统性能的重要指标之一,本文将基于MATLAB进行MIMO-OFDM通信系统的频谱效率仿真。通过上述步骤,我们成功进行了MIMO-OFDM通信系统的频谱效率仿真,并计算得到了频谱效率。首先,我们需要设置通信系统参数:载波数、子载波数、天线数、调制方式等。[MIMO-OFDM通信系统的频谱效率matlab仿真] – MATLAB仿真MIMO-OFDM通信系统的频谱利用效率。最后,我们对接收信号进行解调、去除循环前缀、FFT变换,并计算频谱效率。

启动Docker时,报 Failed to instantiate CLSID_VirtualBox w/ IVirtualBox, but CLSID_VirtualBox w/ IUnknown_我是范特西啊的博客-程序员秘密

在使用DockerToolbox安装完docker后,启动报错,错误信息如下: Failed to instantiate CLSID_VirtualBox w/ IVirtualBox, but CLSID_VirtualBox w/ IUnknown 报错信息如图: 我的系统是WINDOWS 7 64位解决办法是:修改注册表1、 win+r 快捷键打开 “运行”,输入regedit 打

openwrt 认证收费,配置的OpenWrt提供HTTP认证_weixin_39785524的博客-程序员秘密

I need to configure an "Accton MR3201A" access point running OpenWrt.I want it to provide an open WiFi with an HTTP authentication webpage on which users must provide a username & password before ...

react hook 父子组件传值示例_reacthook父子组件参数传值_Richard Yates Boy的博客-程序员秘密

我司现在技术栈是react,用的是开箱即用的pro,我个人习惯用函数式组件,所以用hook比较多。现在写个父子组件传值的示例,希望能帮助到你。父组件:import React, { useState,createContext} from "react";import Counter from './index1'const myContext = createContext();function App() { const [count, setCount] = useState(0)

sql server中varchar和nvarchar的区别_nvarchar一个汉字几个字节_liangshui999的博客-程序员秘密

varchar(n)中的n代表最多能存储多少个字节,超过会报错比如varchar(10)代表最多能存储10个字节,1个汉字要占2个字节,1个英文字母是一个字节。因此varchar(10)最多能存10个英文字母或者5个汉字。create table test1(id int primary key, vname varchar(10), nvname nvarchar(10))--会报...

淘宝技术架构变迁_sxjlinux的博客-程序员秘密

一、个人网站  2003 年 4 月 7 日,马云,在杭州,成立了一个神秘的组织。他叫来十位员工,要他们签了一份协议,这份协议要求他们立刻离开阿里巴巴,去做一个神秘的项目。这个项目要求绝对保密,老马戏称“连说梦话被老婆听到都不行,谁要是透漏出去,我将追杀到天涯海角”。这份协议是英文版的,匆忙之间,大多数人根本来不及看懂,但出于对老马的信任,都卷起铺盖离开了阿里巴巴。  他们去了一个神秘的...

随便推点

(原创)产生AM调幅信号的DDS——VHDL_vhdl实现dds_qdk0901的博客-程序员秘密

 library ieee;use ieee.std_logic_1164.all;use IEEE.numeric_std.all;USE IEEE.std_logic_unsigned.ALL;use ieee.std_logic_arith.all;-- -----------------------------------------------Entity amdds_module is

Snapshot和Release版本_snapshot release_code_agent的博客-程序员秘密

Snapshot和Release版本1.snapshot版本自动获取服务器最新代码原理我们在提交snapshot版本时 mvn deploy,会提交一个带时间搓的版本号!maven会根据模块的版本号(pom文件中的version)中是否带有“-SNAPSHOT”(注意这里必须是全部大写)来判断是快照版本还是正式版本。如果是快照版本,那么在mvn deploy时会自动发布到私服的快照版本库中;如果是正式发布版本,那么在mvn deploy时会自动发布到正式版本库中。我们下载依赖到本地仓库时,也会带

char ch[100];    char *str;    gets(ch);    gets(str);_wtz的代码人生的博客-程序员秘密

char ch[100];   char *str;   gets(ch);//输出小于数组长度内部的字符的值   gets(str);//str首先要分配空间,将指针p分配一组字符串内存地址,指针的作用是保存一个内存地址。将指针str分配一组字符串内存地址如下str = (char *)malloc(NUM*sizeof(char));  gets()函数:从流中读取字符串。

vscode是什么,如何安装vscode_水煮回头鱼的博客-程序员秘密

vscode是什么Visual Studio Code(简称“VS Code” )是Microsoft在2015年4月30日Build开发者大会上正式宣布一个运行于 Mac OS X、Windows和 Linux 之上的,针对于编写现代Web和云应用的跨平台源代码编辑器,可在桌面上运行,并且可用于Windows,macOS和Linux。它具有对JavaScript,TypeScript和Node.js的内置支持,并具有丰富的其他语言(例如C++,C#,Java,Python,PHP,Go)和运行时(例如

20-Minikube快速搭建K8S单节点环境_minikube可以用户生产环境吗_逍遥俊子的博客-程序员秘密

Minikube快速搭建K8S单节点环境1. K8S集群搭建方式1.1 最困难的搭建k8s的方式1.2 简单的搭建k8s的方式1.2.1 minikube1.2.2 kubeadm1.2.3 kops2. Minikube搭建k8s单节点环境1. K8S集群搭建方式K8S大牛:高塔,https://github.com/kelseyhightower1.1 最困难的搭建k8s的方式htt...

ql青龙对接傻妞和node-onebot_青龙ql clone_Aprilz_的博客-程序员秘密

(最新版尚未支持日志芝士,故安装旧版)

推荐文章

热门文章

相关标签