我们在接收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,并在屏幕熄灭时陷印。 然后禁用并重新启用无线网络。 这是有效的,因为过滤器 仅在屏幕熄灭时打开,因此使用 屏幕关闭将使其保持工作,直到屏幕再次关闭。