android即时通讯保活,使用Android WebSocket实现即时通讯功能(2)

本文介绍了如何在Android客户端使用WebSocket进行连接、发送消息及关闭连接。建议使用connectBlocking()方法进行连接,因为它会在连接成功后再发送数据。WebSocket连接通过Service保持后台运行,确保即时通讯功能。同时,通过Binder实现Activity和服务之间的通讯,以便在Activity中发送消息并关闭连接时释放资源。
摘要由CSDN通过智能技术生成

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);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值