Java Android WebSocket服务建立多个连接
我已经创建了一个Web套接字服务。但它一直在进行多重连接 我只希望应用程序建立一个连接,除非网络连接断开,然后再建立另一个连接。 但现在,如果我按下手机上的home(主页)按钮,它会建立一个连接。然后返回应用程序,它将建立另一个连接 谢谢你们的帮助 创建我的主要活动的…Java Android WebSocket服务建立多个连接,java,android,performance,apache,websocket,Java,Android,Performance,Apache,Websocket,我已经创建了一个Web套接字服务。但它一直在进行多重连接 我只希望应用程序建立一个连接,除非网络连接断开,然后再建立另一个连接。 但现在,如果我按下手机上的home(主页)按钮,它会建立一个连接。然后返回应用程序,它将建立另一个连接 谢谢你们的帮助 创建我的主要活动的… Intent startServiceIntent = new Intent(this, WebSocketServices.class); startService(startServiceIntent);
Intent startServiceIntent = new Intent(this, WebSocketServices.class);
startService(startServiceIntent);
清单
<!-- WebSocket -->
<receiver
android:name="com.example.basicplayerapp.core.NetworkReceiver">
<intent-filter >
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
<service android:name="com.example.basicplayerapp.core.WebSocketServices"></service>
WebsocketServices
public class WebSocketServices extends IntentService {
public static final String TAG = WebSocketServices.class.getSimpleName();
private static String SOCKET_ADDR = "http://171.0.0.1:8080";
private String message = null;
private WebSocket socket = null;
public WebSocketServices() {
super("DownloadService");
}
@Override
protected void onHandleIntent(Intent intent) {
Log.i(TAG, "onHandleIntent");
//SOCKET_ADDR = intent.getStringExtra("ip");
if(socket==null || !socket.isOpen() || socket.isPaused())
connectToPASocket(SOCKET_ADDR);
Log.d(TAG,"Service Invoke Function");
}//end onHandleIntent
//=====================================================================================
// Socket connection
//=====================================================================================
private void connectToPASocket(String SOCKET_ADDR) {
Log.i(TAG, "connectToPASocket()");
// Checking
if (socket != null && socket.isOpen()) return;
// Initiate web socket connection
AsyncHttpClient.getDefaultInstance().websocket(SOCKET_ADDR, null,
new AsyncHttpClient.WebSocketConnectCallback() {
@Override
public void onCompleted(Exception ex, WebSocket webSocket) {
Log.i(TAG, "onCompleted");
if (ex != null) {
Log.i(TAG, "onCompleted > if (ex != null)");
ex.printStackTrace();
return;
}
socket = webSocket;
socket.setStringCallback(new StringCallback() {
public void onStringAvailable(String s) {
Log.i(TAG, "socket.setStringCallback > onStringAvailable - s => " + s);
System.out.println("I got a string: " + s);
message = s;
}// end onStringAvailable
});// end socket.setStringCallback
socket.setDataCallback(new DataCallback() { // Find out what this does
@Override
public void onDataAvailable(DataEmitter emitter, ByteBufferList bb) {
Log.i(TAG, "socket.setDataCallback > onDataAvailable | emitter=> " + emitter + " | bb => " + bb);
System.out.println("I got some bytes!");
// note that this data has been read
bb.recycle();
}
});// end webSocket.setDataCallback
}// end onCompleted
});// end AsyncHttpClient.getDefaultInstance()
}// end connectToPASocket
}//end WebSocketServices
尝试在onReceive方法中过滤操作-类似
if(“android.intent.action.BOOT_COMPLETED”).equals(intent.getAction())
之所以发生这种情况,是因为在您返回应用程序后,onCreate将再次被调用,并与套接字建立另一个连接。
因此,如果您的IntentService仍在运行,您可以简单地不启动另一个服务,如下所示:
一旦创建。。。主要活动的类型
if(isMyServiceRunning(WebSocketServices.class)){
Intent startServiceIntent = new Intent(this, WebSocketServices.class);
startService(startServiceIntent);
}
方法查看您的服务是否正在运行
private boolean isMyServiceRunning(Class<?> serviceClass) {
ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
if (serviceClass.getName().equals(service.service.getClassName())) {
return true;
}
}
return false;
}
private boolean IsMyService正在运行(类serviceClass){
ActivityManager=(ActivityManager)getSystemService(Context.ACTIVITY_服务);
for(RunningServiceInfo服务:manager.getRunningServices(Integer.MAX_值)){
if(serviceClass.getName().equals(service.service.getClassName())){
返回true;
}
}
返回false;
}
您应该使用常规服务,而不是意向服务。一旦意图服务完成,它就完成了。服务可以启动一个后台线程,该线程将维持web套接字连接,直到您显式终止它;或者操作系统回收服务的内存(您需要在内存中再次启动它) MrT,我也有类似的问题
不要使用intentService。只要使用服务。因为一旦完成了intentService,它将自行完成
更改为服务后,您可以使用布尔值检查您的服务是否已按如下方式启动:
boolean isSockeStarted = false;
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
...
if (socket == null || !socket.isOpen() || socket.isPaused()) {
if (isSockeStarted) { //not started
} else {
isSockeStarted = true;
}
}
....
也就是说,这项服务只会启动一次。直到你手动杀死它
这对我很有效,试着让我知道。谢谢,这很有效。非常非常非常感谢。感谢所有其他给我反馈的人
boolean isSockeStarted = false;
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
...
if (socket == null || !socket.isOpen() || socket.isPaused()) {
if (isSockeStarted) { //not started
} else {
isSockeStarted = true;
}
}
....