我在Android应用程序中遇到了一个陌生人问题。
我发出一个启动服务的警报,如下所示:
public class ExecutaAcoes extends Service implements Runnable {
protected static final String URL = "http://www.mysite.com.br"
@Override
public void onCreate() {
Log.i("Teste","Service started");
new Thread(this).start();
}
@Override
public void run() {
try {
Log.i("Teste","Thread started");
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet(URL);
HttpResponse response = client.execute(request);
HttpEntity entity = response.getEntity();
if (entity != null) {
...
} catch (Throwable e) {
Log.i("Teste","erro excepty: "+e.toString());
} finally {
};
因此,每30秒报警管理器启动该服务,并访问网页www.mysite.com.br。此代码在模拟器中工作正常,但在我的设备上没有。当手机休眠(并且屏幕停电)时,网页未被访问,应用程序返回catch中的错误(Throwable e):“java.net.UnknownHostException:Host is unresolved”或返回套接字错误。
奇怪的是,如果我按下设备上的任何按钮并且屏幕亮起,则应用程序返回正常工作并访问网站。 有谁知道如何解决这个问题?
感谢您的帮助 亚历山大
答案 0 :(得分:2)
这很正常。当设备进入睡眠状态时,某些功能不可用。 AlarmManager
保存CPU唤醒锁定,以便在警报响起时执行onReceive()
方法。请注意,这仅影响此方法:如果启动服务,则此保证不会扩展到此服务。此外,它只为您提供CPU唤醒锁定,这意味着CPU将运行,而不是屏幕和网络。
要从您的服务访问Wifi,您需要获取WifiManager.WifiLock
。对于3g,屏幕和其他功能,请参阅PowerManager
。
此外,每隔30秒运行一次网络扫描会在几个小时内耗尽电池 - 用户不会喜欢这样。使用server push (with wifi lock)或sync adapter重新考虑。
答案 1 :(得分:1)
您应该尝试此http://developer.android.com/reference/android/net/wifi/WifiManager.WifiLock.html,以便在完成操作之前保持Wifi处于活动状态。当手机睡眠时,Wifi关闭。希望这有帮助!