当前位置: 首页 > 知识库问答 >
问题:

Android - 网页锁手 - 从最近使用的应用程序中清除应用程序时,连接从服务中删除

归星驰
2023-03-14

我创建了一个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);
    }
}

主要活动

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个答案

何雅惠
2023-03-14

使用服务,但在前台,例如:https://www.101apps.co.za/articles/services-tutorials-part-2-a-foreground-service.html

 类似资料:
  • 后台服务是停止的,从最近在oppo&vivo手机中删除我的应用程序时,&广播累西弗在那种情况下也不工作。

  • 我通过自己的webservice用PHP发送Firebase通知,如下所示。 1.当应用程序在前台和后台没有任何问题时,通知就会出现,但如果我从最近的托盘中删除了应用程序,那么通知就不会出现,我必须要处理这个问题,有什么解决方案吗?(就像Whatsup通知显示的所有场景,甚至我强制停止了这个应用程序的设置) 2.一旦我收到通知,从“OnMessageReceived”如何将这些消息、正文内容传递给

  • 在Intellij中,可以在同一端口上同时部署多个应用程序(部署在Tomcat实例中配置的应用程序)。在Tomcat start上应该部署的应用程序列表中,您在哪里添加/删除应用程序? Intellij文档这么说,但我找不到它描述的是什么文件。 除其他外,Tomcat配置文件可能会列出应在服务器启动时部署的应用程序。

  • 免责声明:我知道人们通常不会这样做,我使用SQL数据库是出于成本原因,而且我对编程比较陌生。 我正在尝试从我的Android Studio应用程序向我的MariaDB数据库发送SQL脚本。我目前正在为MariaDB实现一个Java数据库连接(JDBC)驱动程序,但我不确定需要包括什么。 我去了JDBC MariaDB驱动程序的下载网站,但是有很多jar文件,我可以选择下载。你怎么知道你需要哪一个,

  • 我试图开发一个android应用程序,可以擦除其他应用程序的缓存数据,我试图浏览所有的博客,但没有一个对我有效,我可以通过以下代码清除我的应用程序的缓存 我想清除其他应用程序的缓存,可以任何机构请帮助我,如果我错了请纠正我,提前谢谢。

  • 有没有办法取消发布,然后从Android开发者控制台的应用程序列表中永久删除一个应用程序?