Android - WebSocket - Соединение обрывается из-за сброса приложения из недавно использованных приложений - PullRequest
0 голосов
/ 04 декабря 2018

Я создал службу Android для поддержания соединения WebSocket.Я звоню в сервис от MainActivity.Таким образом, соединение устанавливается, когда я открываю приложение, а также получаю сообщение с сервера WebSocket.Если я минимизирую приложение, то в это время также есть связь.Это нормально.

Если я очищаю приложение от недавно использованных приложений, соединение отключается от сервера.Но мой сервис продолжает работать на моем устройстве.

Снимок экрана: удаление недавно использованных приложений

Класс обслуживания

package com.myapp;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.util.Log;

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.WebSocket;

public class WebSocketService extends Service {

    public static final String TAG = WebSocketService.class.getSimpleName();

    private static  String SOCKET_ADDR = "ws://pc-websocket:8080/WebSocket/Endpoint";

    WebSocket socket;
    private OkHttpClient client;

    public WebSocketService() {
        super();
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        if(socket==null) {
            new Thread(new Runnable() {
                public void run() {

                    connectWSocket(SOCKET_ADDR);

                }
            }).start();
        }
        return START_STICKY;
    }

    private void connectWSocket(String SOCKET_ADDR) {
        Log.i(TAG, "connectToPASocket()");

        client = new OkHttpClient();

        Request request = new Request.Builder().url(SOCKET_ADDR).build();
        EchoWebSocketListener listener = new EchoWebSocketListener(this);
        socket = client.newWebSocket(request, listener);

    }
}

WebSocketListener

package com.myapp;

import android.content.Context;
import android.support.v4.app.NotificationCompat;

import android.app.NotificationManager;

import okhttp3.Response;
import okhttp3.WebSocket;
import okhttp3.WebSocketListener;
import okio.ByteString;

public final class EchoWebSocketListener extends WebSocketListener {

    private static final int NORMAL_CLOSURE_STATUS = 1000;

    private Context context;

    public EchoWebSocketListener(){
    }

    public EchoWebSocketListener(Context context){
        this.context=context;
    }

    @Override
    public void onOpen(WebSocket webSocket, Response response) {
    }

    @Override
    public void onMessage(WebSocket webSocket, String message) {
        NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this.context, null)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentTitle(message)
                .setContentText(message)
                .setStyle(new NotificationCompat.BigTextStyle()
                        .bigText(message))
                .setPriority(NotificationCompat.PRIORITY_DEFAULT);
        NotificationManager notificationManager = (NotificationManager) this.context.getSystemService(Context.NOTIFICATION_SERVICE);
        notificationManager.notify(123, mBuilder.build());
    }

    @Override
    public void onMessage(WebSocket webSocket, ByteString bytes) {
    }

    @Override
    public void onClosing(WebSocket webSocket, int code, String reason) {
        webSocket.close(NORMAL_CLOSURE_STATUS, null);
    }

    @Override
    public void onFailure(WebSocket webSocket, Throwable t, Response response) {
        webSocket.close(NORMAL_CLOSURE_STATUS, null);
    }
}

MainActivity

package com.myapp;

import android.app.ActivityManager;
import android.content.Context;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Intent mServiceIntent = new Intent(getApplicationContext(), WebSocketService.class);
        startService(mServiceIntent);
    }

}

Мне нужна помощь по этому вопросу.Есть ли другой способ сохранить соединение WebSocket?

Я пытался соединиться с AsyncHttpClient.Но та же проблема.

AsyncHttpClient.getDefaultInstance().websocket("ws://pc-websocket:8080/WebSocket/Endpoint",
          null, new AsyncHttpClient.WebSocketConnectCallback() {
                .....
                .....

1 Ответ

0 голосов
/ 16 декабря 2018

Служба используется, но на переднем плане, например: https://www.101apps.co.za/articles/services-tutorials-part-2-a-foreground-service.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...