Android 中 websocket 的替代

问题描述

在本地环境中,我有一些 Android 设备与前台服务中的 Web 套接字连接。 此套接字连接仅侦听消息并将它们推送到推送通知。 有时您可能数小时或数天都收不到消息,因此这需要非常稳定。

当屏幕处于锁定模式时,推送通知有效,前几分钟连接正常。如果在 10-15 分钟后推送消息,则不会显示通知消息。 一旦出现另一条消息,上一条消息就会突然被选中并显示出来。 60 分钟或更长时间后,根本不会显示任何消息。连接似乎不再完整,服务器和应用程序日志也没有显示连接丢失。

我已经为此进行了超过 4 天的密集工作,但令我沮丧的是,这并没有奏效。 我找到了很多与此主题相关的主题关闭了应用程序的优化,每分钟发送一次 ping (StayAlive) 到服务器,但都无济于事。

是否有其他选项可以通过前台服务与服务器建立稳定的连接?

请告诉我。

提前致谢。

解决方法

它已修复。

通过在我的清单和代码中添加以下权限,应用程序不再打瞌睡。

<uses-permission 
android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>

Java 代码:

public void turnOffDozeMode(Context context){  //you can use with or without passing context
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            Intent intent = new Intent();
            String packageName = context.getPackageName();
            PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
            if (pm.isIgnoringBatteryOptimizations(packageName)) // if you want to desable doze mode for this package
                intent.setAction(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS);
            else { // if you want to enable doze mode
                intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
                intent.setData(Uri.parse("package:" + packageName));
            }
            context.startActivity(intent);
        }
    }

来源: how to turn off doze mode for specific apps in marshmallow devices programmatically

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...