Android WebSocket 服务进行多个连接

2023-11-26

我创建了一个 Web 套接字服务。但它不断建立多个连接

我只希望应用程序建立一个连接,除非网络连接断开然后建立另一个连接。 但现在,如果我按下手机上的主页按钮,它就会建立一个连接。然后返回应用程序,它将建立另一个连接。

谢谢你们的帮助。

在创建...我的主要活动

Intent startServiceIntent = new Intent(this, WebSocketServices.class);
        startService(startServiceIntent);

Manifest

<!-- 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>

网络接收器

public class NetworkReceiver extends BroadcastReceiver {
    public static final String TAG = HomeActivity.class.getSimpleName();

    @Override
    public void onReceive(Context context, Intent intent) {         
        ConnectivityManager conn =  (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = conn.getActiveNetworkInfo();

        if (networkInfo != null && networkInfo.getDetailedState() == NetworkInfo.DetailedState.CONNECTED) {
            Log.i(TAG, "connected");

            Intent startServiceIntent = new Intent(context, WebSocketServices.class);
            context.startService(startServiceIntent);

        } 
        else if(networkInfo != null){
            NetworkInfo.DetailedState state = networkInfo.getDetailedState();
            Log.i(TAG, state.name());
        }
        else {
            Log.i(TAG, "lost connection");

        }


    }//end onReceive    
};//end NetworkReceiver

Websocket服务

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

MrT,我也遇到了类似的问题。

不要使用intentService。只需使用服务即可。因为一旦intentService完成,它就会自行完成。

更改为 Service 后,您可以做的是使用 boolean 来检查您的服务是否已启动,如下所示:

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;
            }
        }
....

这意味着该服务只会启动一次。直到你手动杀死它。

它对我有用,尝试让我知道。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android WebSocket 服务进行多个连接 的相关文章

随机推荐

  • 计算二项式系数的递归算法的时间复杂度

    我正在研究算法复杂性分析 我有不合格问题或C n k int C int n int k if n k k 0 return 1 return C n 1 k C n 1 k 1 我如何确定其执行复杂度或T n 您正在寻找的复发是 T n
  • 打开由竖线字符“|”分隔的 csv 文件或不常见的分隔符

    我正在尝试设置一个 Excel VBA 代码来打开一些 csv 文件并将包含的信息拆分为由字符分隔的列 我设法打开文件 但我使用的代码打开文件时没有根据分隔符分割文本 到目前为止我已经尝试过以下代码 Sub OpenCSV Dim wkbT
  • main:Object 的未定义方法复数

    我正在尝试在控制台中测试一种方法 但即使是基本的复数 pluralize 1 person 不会工作 Output NoMethodError undefined method pluralize for main Object from
  • 从下拉列表中获取旧值和新值

    我试图简单地获取以前的值 以及从下拉列表中新选择的值 在此示例中 下拉列表中预先填充了为用户分配的当前组 当下拉列表更改时 我希望能够返回旧值和新值 我已经可以获得旧值 但我不知道如何返回新值 控制器代码 User Object userA
  • es6导入三个.js

    我的 es6 工作流程使用 babel 和 babel plugin transform es2015 modules system js 来only转换模块导入 导出以与 system js 一起使用 我只是对所有 es6 功能使用 绿色
  • VS2013:查找资源字典时出错

    我刚刚拿到VS2013并打开了我的VS2010项目 但是现在我看不到任何 xaml 设计 问题是样式没有被应用
  • 添加多个浮点变量时最小化浮点误差

    在我的 C 应用程序中 我有一个范围 0 1 内的双精度向量 我必须尽可能准确地计算其总数 感觉这个问题之前应该已经解决了 但我找不到任何东西 显然 如果向量大小很大并且有些项目明显小于其他项目 则迭代向量上的每个项目并执行 sum vec
  • 播种default_random_engine?

    我使用的是 Visual Studio 2010 不支持
  • 如何编写 cpp __DIR__ 宏,类似于 __FILE__

    The FILE and LINE 宏内置于C预处理器 通常用于打印带有文件名和行号的调试输出 我需要类似的东西 但只有路径末尾的目录名称 例如 如果我的代码位于 home davidc some path to some code foo
  • Mobile safari 对大图像进行下采样。如何挽留?

    我有一个 HTML 页面 其中包含 1675 像素 x 2640 像素的图像 我尝试在 iPad 上查看它 显然移动 safari 降低了图像的采样率 我们想要展示高质量的图像 但 Safari 限制了这一点 我一直在寻找保留图像大小的解决
  • Java中文件名的编码

    我正在嵌入式 Linux 平台上运行一个小型 Java 应用程序 将Java VM JamVM替换为OpenJDK后 带有特殊字符的文件名无法正确存储 特殊字符 如变音符号 将替换为问号 这是我的测试代码 import java io Fi
  • 为什么反应本机项目是在打字稿中创建的?我想要app.js

    我是 React Native 的初学者 我正在使用 React Native CLI 创建一个 React Native 项目 但项目是使用 app ts 创建的 我想在 javascript 版本中创建项目 我尝试过 React Nat
  • 多重继承不明确的基类

    考虑代码 struct Base struct Derived public Base struct A public Base struct B public A public Base struct C public A public
  • 如何限制 jQuery 事件的回调?

    好的 所以我像在谷歌中一样进行搜索 您在输入中键入文本 它会立即为您提供条目 但我不喜欢这样 我用类似的东西 TEXTINPUT keyup function 当用户输入速度非常快时 它会多次连接到数据库 是否有可能 只有当用户停止输入 1
  • 等待 Workbook.RefreshAll() (C#)

    我想循环遍历一个目录 使用 C 并刷新其中的所有 Excel 工作表 我用 Workbook RefreshAll 我该如何等待Workbook RefreshAll 声明结束 问题是 我打开FileA then Workbook Refr
  • 一个 Java 类中最多可以使用多少个 lambda?

    这是一个纯粹概念性的问题 Java 8 中的 Lambda 被转换为使用以下方式调用的方法invokedynamic 如果 JVM 对一个类可以拥有的最大方法数有限制 这是否意味着一个类中使用的 lambda 最大数量也受到 JVM 的严格
  • 使用 redux 时,应该如何在 React 组件中处理取消订阅?

    在我的组件中 我有以下内容 componentWillMount function this unsubscribe store subscribe function this setState message store getState
  • 如何将Scala Squeryl ORB与play 2.0框架集成?

    我正在尝试将 Squeryl ORB 与 play 2 0 框架一起使用 但是在调用时DB getConnection 在初始化期间我得到 BadPath 路径参数 无效路径 找不到defaultdb的数据源 路径表达式中不允许使用令牌 如
  • 从 device_vector 中删除元素

    推力 device vector 值 推力 device vector 键 初始化后 keys包含一些等于 1的元素 我想删除键中和值相同位置的元素 但不知道并行如何处理 可能有很多方法可以做到这一点 一种可能的方式 使用模板版本thrus
  • Android WebSocket 服务进行多个连接

    我创建了一个 Web 套接字服务 但它不断建立多个连接 我只希望应用程序建立一个连接 除非网络连接断开然后建立另一个连接 但现在 如果我按下手机上的主页按钮 它就会建立一个连接 然后返回应用程序 它将建立另一个连接 谢谢你们的帮助 在创建