在安卓上的睡眠模式(不在睡眠模式下)之后没有 UDP 广播数据包



我们在接收UDP广播数据包时遇到了一个大问题。我快疯了...

问题是:

1-一切正常。

2-我们可以接收数据包。

3-如果我不关闭安卓(主页按钮或键关闭未按下),我让安卓进入睡眠状态(屏幕关闭 ->暂停和停止)

4-我关闭了我的接入点(没有wifi,以模拟出门在外)。

5-我等2分钟

6-I 打开接入点

7-当安卓唤醒时,我总是收到超时,在这种情况下:

如果我再次启动具有日食>超时的应用程序

如果我销毁应用程序(后退按钮)并重新启动(onCreate)应用程序 ->超时

如果我按主页按钮唤醒 ->超时

如果我禁用并启用wifi --> OK,我会收到数据包

如果我按关闭键唤醒 ->确定,我收到数据包

                Asycntask do in background{
                .....
                byte[] message = new byte[1500];
                s = new DatagramSocket(null);
                s.setReuseAddress(true);
                s.bind(new InetSocketAddress(dataclass.getDataclass().GGGPort));
                p = new DatagramPacket(message, message.length);
                s.setSoTimeout(500);
                s.setBroadcast(true);
                dataclass.getDataclass().setGoOut(true);
                s.receive(p);
                }

问题:

1-唤醒安卓的主页按钮和关闭键有什么区别?它们执行相同的操作 -> OnPause,OnStop>(解锁)OnRestart。无线网络会怎样?

2-为什么当程序正在运行但未接收时,如果我禁用/启用wifi,它可以正常工作?这意味着代码没问题...这是一个安卓问题?

PD:我杀死异步任务停止并在重新启动时执行

我认为

问题可能是在Android上关闭WiFi以节省电池电量。我不知道恢复 WIFi 的确切条件,可能如果您发送数据包,它将被启用。

要保持WiFi并接收数据包,您可能需要使用WifiManager.WifiLock。还有多播锁,但似乎你不需要它。

从文档中:

允许应用程序使 Wi-Fi 无线电保持唤醒状态。通常,当用户有一段时间没有使用设备时,Wi-Fi 无线电可能会关闭。获取 WifiLock 将使收音机保持打开状态,直到锁被释放。

在使用 WifiLock 之前,请仔细考虑您的应用程序是否需要 Wi-Fi 访问,或者是否可以通过移动网络运行(如果可用)。需要下载大文件的程序应持有 WifiLock 以确保下载完成,但网络使用偶尔或低带宽的程序不应持有 WifiLock,以免对电池寿命产生不利影响。

任何使用 WifiLock 的应用程序都必须在应用程序清单的元素中请求android.permission.WAKE_LOCK权限。

此线程处理以下问题: https://groups.google.com/forum/?fromgroups=#!topic/android-platform/OpbSdp9FTmA

基本上,解决方案是

获取PARTIAL_WAKE_LOCK,并在屏幕熄灭时陷印。 然后禁用并重新启用无线网络。 这是有效的,因为过滤器 仅在屏幕熄灭时打开,因此使用 屏幕关闭将使其保持工作,直到屏幕再次关闭。

最新更新