接收UDP广播包时遇到了很大的问题。我疯了......
问题是:
1 - 一切运作良好。
2 - 我们可以收到数据包。
3 - 如果我没有关闭android(主页按钮或按键没有按下),我让android进入睡眠状态(屏幕关闭 - > OnPause和OnStop)
4 - 我关闭了我的接入点(没有wifi,模拟出门)。
5 - 我等了2分钟
6-I打开接入点
7 - 当Android醒来时,我会一直收到超时,在这种情况下:
如果我再次使用eclipse启动应用程序 - >超时
如果我销毁应用程序(后退按钮)并重新启动(onCreate)应用程序 - >超时
如果我按主页按钮唤醒 - >超时
如果我禁用并启用wifi - >好的,我收到了数据包
如果我按下按键唤醒 - >好的,我收到了数据包
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 - 唤醒android的主页按钮和按键关闭按钮有什么区别?他们做同样的事情 - > OnPause,OnStop - > (解锁)OnRestart。 wifi会发生什么?
2 - 为什么当程序运行但没有收到时,如果禁用/启用wifi,它可以正常工作吗?这意味着代码没问题......这是一个Android问题吗?
P.D:我杀了Asynctask OnStop,我在Restart
上执行答案 0 :(得分:0)
我认为问题可能是在Android上关闭WiFi以节省电池。我不知道恢复WIFi的确切条件,可能如果您发送数据包,它将被启用。
要继续使用WiFi并接收数据包,您可能需要使用WifiManager.WifiLock。还有MulticastLock,但似乎你不需要它。
来自docs:
允许应用程序保持Wi-Fi无线电状态清醒。通常,当用户暂时不使用设备时,Wi-Fi无线电可能会关闭。获取WifiLock将保持收音机打开,直到锁定被释放。
在使用WifiLock之前,请仔细考虑您的应用是否需要Wi-Fi接入,或者是否可以通过移动网络运行(如果有)。需要下载大文件的程序应该保存WifiLock以确保下载完成,但是网络使用偶尔或低带宽的程序不应该保留WifiLock以避免对电池寿命产生负面影响。
任何使用WifiLock的应用程序都必须在应用程序清单的元素中请求android.permission.WAKE_LOCK权限。
答案 1 :(得分:0)
此主题处理问题:https://groups.google.com/forum/?fromgroups=#!topic/android-platform/OpbSdp9FTmA
基本上,解决方案是
获取PARTIAL_WAKE_LOCK,并在屏幕熄灭时陷阱。 然后禁用并重新启用wifi。这是因为过滤器 只有在屏幕熄灭时才会打开,所以开始使用 屏幕关闭将使其保持工作,直到屏幕再次关闭。