【问题标题】:Android app stop to work when device sleepAndroid 应用程序在设备睡眠时停止工作
【发布时间】:2011-10-18 13:02:26
【问题描述】:

好吧,我在我的 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”或返回套接字错误。

奇怪的是,如果我按下设备上的任何按钮并且屏幕亮起,应用程序就会恢复正常工作并且可以访问网站。 有谁知道如何解决这个问题?

感谢您的帮助 亚历山大

【问题讨论】:

  • 你能说明你是如何请求这个警报的吗? (无关:如果手机休眠,为什么必须每 30 秒更新一次?这对电池寿命不利)

标签: java android


【解决方案1】:

这是正常的。当设备进入睡眠状态时,某些功能不可用。 AlarmManager 持有 CPU 唤醒锁,因此当警报响起时,您的 onReceive() 方法会被执行。请注意,这只影响此方法:如果您启动服务,则此保证不会扩展到此服务。此外,它只给你 CPU 唤醒锁定,这意味着 CPU 将运行,而不是屏幕和网络。

要从您的服务访问 Wifi,您需要获取 WifiManager.WifiLock。 3g、屏幕等功能见PowerManager。

此外,每 30 秒运行一次网络扫描会在几个小时内耗尽电池电量 - 用户不会喜欢这样。重新考虑使用server push (with wifi lock) 或sync adapter。

【讨论】:

    【解决方案2】:

    您应该尝试这个http://developer.android.com/reference/android/net/wifi/WifiManager.WifiLock.html,以便在您完成操作之前保持 Wifi 处于活动状态。当手机休眠时,Wifi 关闭。希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-22
      • 2021-03-10
      • 1970-01-01
      • 1970-01-01
      • 2016-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多