Files
FLYSN/app/src/main/java/com/info/sn/service/StepService.java
Administrator f037e1cb12 update:2019.04.22
fix:增加绑定确认
add:
2020-04-22 18:23:50 +08:00

201 lines
6.1 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package com.info.sn.service;
/**
* 作者 mjsheng
* 日期 2019/4/1 10:57
* 邮箱 501802639@qq.com
* 来自:
*/
import android.app.Service;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Binder;
import android.os.Handler;
import android.os.IBinder;
import android.util.Log;
import androidx.annotation.Nullable;
import com.info.sn.KeepAliveConnection;
import com.info.sn.network.JWebSocketClient;
import com.info.sn.utils.LogUtils;
import com.info.sn.utils.ServiceAliveUtils;
import com.info.sn.utils.Utils;
import org.java_websocket.handshake.ServerHandshake;
import java.net.URI;
/**
* 主进程 双进程通讯
*
* @author LiGuangMin
* @time Created by 2018/8/17 11:26
*/
public class StepService extends Service {
public JWebSocketClient client;
private JWebSocketClientBinder mBinder = new JWebSocketClientBinder();
private final static String TAG = StepService.class.getSimpleName();
//用于Activity和service通讯
public class JWebSocketClientBinder extends Binder {
public StepService getService() {
return StepService.this;
}
}
private ServiceConnection mServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
LogUtils.e(TAG, "StepService:建立链接");
boolean isServiceRunning = ServiceAliveUtils.isServiceAlice();
if (!isServiceRunning) {
Intent i = new Intent(StepService.this, MyDownloadService.class);
startService(i);
}
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
// 断开链接
startService(new Intent(StepService.this, GuardService.class));
// 重新绑定
bindService(new Intent(StepService.this, GuardService.class), mServiceConnection, Context.BIND_IMPORTANT);
}
};
@Nullable
@Override
public IBinder onBind(Intent intent) {
return new KeepAliveConnection.Stub() {
};
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// startForeground(1, new Notification());
// 绑定建立链接
bindService(new Intent(this, GuardService.class), mServiceConnection, Context.BIND_IMPORTANT);
//初始化websocket
initSocketClient();
mHandler.postDelayed(heartBeatRunnable, HEART_BEAT_RATE);//开启心跳检测
return START_STICKY;
}
/**
* 初始化websocket连接
*/
private void initSocketClient() {
URI uri = URI.create("ws://47.107.116.173:2345");
// URI uri = URI.create("ws://echo.websocket.org");
// URI uri = URI.create("ws://123.207.136.134:9010/ajaxchattest");
client = new JWebSocketClient(uri) {
@Override
public void onMessage(String message) {
Log.i("JWebSocketClientService", "收到服务器发来的消息:" + message + "?");
}
@Override
public void onOpen(ServerHandshake handshakedata) {
super.onOpen(handshakedata);
Log.i("JWebSocketClientService", "websocket连接成功");
}
};
connect();
}
/**
* 连接websocket
*/
private void connect() {
new Thread() {
@Override
public void run() {
try {
//connectBlocking多出一个等待操作会先连接再发送否则未连接发送会报错
Log.i("JWebSocketClientService", "websocket链接中");
client.connectBlocking();
} catch (InterruptedException e) {
Log.i("JWebSocketClientService", e.getMessage());
// e.printStackTrace();
}
}
}.start();
}
/**
* 发送消息
*
* @param msg
*/
public void sendMsg(String msg) {
if (null != client) {
Log.i("JWebSocketClientService", "发送的消息:" + msg);
client.send(msg);
}
}
/**
* 断开连接
*/
private void closeConnect() {
try {
if (null != client) {
client.close();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
client = null;
}
}
// -------------------------------------websocket心跳检测------------------------------------------------
private static final long HEART_BEAT_RATE = 50 * 1000;//每隔55秒进行一次对长连接的心跳检测
private Handler mHandler = new Handler();
private Runnable heartBeatRunnable = new Runnable() {
@Override
public void run() {
Log.i("JWebSocketClientService", "心跳包检测websocket连接状态");
if (client != null) {
if (client.isOpen()) {
Log.i("JWebSocketClientService", "websocket已连接");
sendMsg(Utils.getSerial());
} else if (client.isClosed()) {
Log.i("JWebSocketClientService", "websocket重连中");
reconnectWs();
}
} else {
//如果client已为空重新初始化连接
client = null;
initSocketClient();
}
//每隔一定的时间,对长连接进行一次心跳检测
mHandler.postDelayed(this, HEART_BEAT_RATE);
}
};
/**
* 开启重连
*/
private void reconnectWs() {
mHandler.removeCallbacks(heartBeatRunnable);
new Thread() {
@Override
public void run() {
try {
Log.i("JWebSocketClientService", "开启重连");
client.reconnectBlocking();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}.start();
}
}