Wifi 睡眠,即使有锁

2024-02-07

总结:即使获取了wifi锁,当手机使用电池运行时,wifi也会在一段时间后断开。

我已将问题简化为带有启动线程的按钮的单个活动。它只是向 PC 上运行的回显服务器发送 100.000 个字符串(每 100 毫秒一个字符串)。请参阅下面的代码。我可以使用 WireShark 查看流量,并且回显服务器也显示字符串。请注意在开始发送之前如何获取 WiFi 和电源锁(当然,以及之后如何释放)。

然而,当手机使用电池运行并且用户关闭手机时,它会持续发送字符串一段时间,然后 WiFi 会断开,手机甚至不会响应 ping。需要600到6000秒才能断开连接(数字是那一轮,所以我认为它们很重要)。

连接空调时它可以完美工作,所以我猜它在某种程度上与电源管理有关。

为了测试它,我只需启动该活动,启动 echo 服务器,启动 WireShark,按“开始”按钮(android:onClick="doStart"),挡住手机并将其放在桌子上。我去吃午饭或其他什么地方,600-6000 秒后,我可以看到 WireShark 上的 tx 错误,echo 服务器已停止接收流量,并且手机不响应 ping。

手机是2.2,WiFi策略设置为“15m后睡眠”。

package Odroid.test;

import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Date;

import android.app.Activity;
import android.content.Context;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.os.PowerManager;
import android.view.View;
import android.widget.Button;

public class Test extends Activity {
  PowerManager _powerManagement = null;
  PowerManager.WakeLock _wakeLock = null;
  WifiManager.WifiLock _wifiLock = null;

  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
  }

  public void doStart(View v) {
    DoerThreadFake t = new DoerThreadFake();
    t.start();
  }

  private class DoerThreadFake extends Thread {
    public void run() {
      runOnUiThread(new Runnable() {
        public void run() {
          ((Button) findViewById(R.id.start)).setText("Doing...");
        }
      });
      _keepOnStart();
      Socket s;
      byte[] buffer = new byte[1000];

      try {
        s = new Socket("192.168.0.16", 2000);
        PrintStream ps = new PrintStream(s.getOutputStream());
        InputStream is = s.getInputStream();
        for (int i = 0; i < 100000; i++) {
          ps.println(System.currentTimeMillis() +"("+(new Date()).toString() +") : " + i);
          try {
            Thread.sleep(100);
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
          while (is.available() > 0) {
            int a = is.available();
            if (a > 1000) a = 1000;
            is.read(buffer, 0, a); // Clean echo
          }
        }
      } catch (UnknownHostException e) {
        e.printStackTrace();
      } catch (IOException e) {
        e.printStackTrace();
      }
      _keepOnStop();
      runOnUiThread(new Runnable() {
        public void run() {
          ((Button) findViewById(R.id.start)).setText("Done");
        }
      });
    }

    private void _keepOnStart() {
      if (_powerManagement == null) {
        _powerManagement = (PowerManager) getSystemService(Context.POWER_SERVICE);
      }
      if (_wakeLock == null) {
        _wakeLock = _powerManagement.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.ON_AFTER_RELEASE,
            "0 Backup power lock");
      }
      _wakeLock.acquire();
      WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
      if (wifiManager != null) {
        _wifiLock = wifiManager.createWifiLock("0 Backup wifi lock");
        _wifiLock.acquire();
      }
    }

    private void _keepOnStop() {
      if ((_wifiLock != null) && (_wifiLock.isHeld())) {
        _wifiLock.release();
      }
      if ((_wakeLock != null) && (_wakeLock.isHeld())) {
        _wakeLock.release();
      }
    }
  }
}

清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest
  xmlns:android="http://schemas.android.com/apk/res/android"
  package="Odroid.test"
  android:versionCode="1"
  android:versionName="1.0"
>
  <uses-sdk android:minSdkVersion="4" />

  <application
    android:icon="@drawable/icon"
    android:label="@string/app_name"
  >
    <activity
      android:name=".Test"
      android:label="@string/app_name"
    >
      <intent-filter>
        <action
          android:name="android.intent.action.MAIN" />
        <category
          android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>

  </application>
  <uses-permission android:name="android.permission.INTERNET" />
  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
  <uses-permission android:name="android.permission.WAKE_LOCK" />

</manifest>

任何想法?


Android 错误跟踪器上有许多与 wifi 睡眠/省电模式有关的错误,甚至有可用的应用程序试图纠正此问题。所以很可能你没有做错任何事。

http://code.google.com/p/android/issues/detail?id=9781 http://code.google.com/p/android/issues/detail?id=9781
http://code.google.com/p/android/issues/detail?id=1698 http://code.google.com/p/android/issues/detail?id=1698

另请查看 wififixer,这是一个开源项目,它可以帮助您使用代码来保持连接处于活动状态

http://wififixer.wordpress.com/ http://wififixer.wordpress.com/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Wifi 睡眠,即使有锁 的相关文章

  • Android Studio 3.0.0 不允许 DOCTYPE

    升级到Android Studio 3 0 0 同步并更新gradle插件 出现以下错误 Error DOCTYPE not allowed if function http apache org xml features disallow
  • Android 2.2 SDK - Droid X 相机活动无法正常完成

    我注意到我在 Droid X 上调用的默认相机活动与我的 Droid 和 Nexus One 上的默认相机活动看起来不同 在 Droid 和 Nexus One 上选择 确定 后 活动将完成 Droid X 有一个 完成 按钮 它将带您返回
  • 强制用户在 Android 中的 EditText 中输入内容

    我的活动中有几个编辑文本 我希望我的用户在提交表单之前正确输入 我该怎么做 我还有旋转器和 RadioGroup 按钮 你可以加验证在提交按钮上单击 private boolean validateFields int yourDesire
  • 对话框上的 EditText 不返回任何文本

    我太累了 找不到错误 我没有发现任何错误 但我没有从 editText 收到任何文本 请看下面的代码 活动密码 xml
  • Retrofit-2 内容类型问题

    我的 Api 接受 Content Type application json 作为标头 我按照改造文档中所述完美设置了标题 Headers Content Type application json POST user classes C
  • Android 应用被 Google Play 拒绝

    我最近向 Google Play 商店提交了一个 Android 应用程序 但收到一条消息说我的应用程序已被拒绝 我不确定问题是什么 也找不到确切的解决方案 拒绝原因 违反了禁止行为条款 内容政策 经过定期审核后 我们确定您的应用程序支持
  • Firestore - RecycleView - 图像持有者

    我不知道如何编写图像的支架 我已经设置了 2 个文本 但我不知道图像的支架应该是什么样子 你能帮我告诉我图像的文字应该是什么样子才能正确显示吗 holder artistImage setImageResource model getArt
  • 如何以编程方式断开拨出呼叫

    我使用以下代码以编程方式断开呼叫 但它不起作用 private void callDisconnect try TelephonyManager manager TelephonyManager this getSystemService
  • 以编程方式更新 Android 中的联系人姓名和电话号码

    我创建一个应用程序来读取 更新 删除联系人详细信息 这是更新联系人姓名和电话号码的问题 有人可以帮助我吗 我该怎么做 我正在使用以下代码 但它不起作用 Override public View onCreateView LayoutInfl
  • 如何将 android.net.Uri 转换为 java.net.URL? [复制]

    这个问题在这里已经有答案了 有没有办法从Uri to URL 我正在使用的库需要这个 它only接受一个URL但我需要在我的设备上使用图像 如果该方案的Uri is http or https new URL uri toString 应该
  • 如何以编程方式启动 ssh 服务器 android,以及如何获取连接到设备的用户名和密码

    我正在开发像这样的应用程序sshdroid 我想在 Android 操作系统上打开 ssh 连接 并且我想从电脑连接应用程序 我使用了 JSCH lib 但是这个lib用于将android连接到pc 我的要求是pc到android 任何人都
  • Android Studio 将音乐文件读取为文本文件,如何恢复它?

    gameAlert mp3是我的声音文件 运行应用程序时 它询问我该文件不与任何文件类型关联 请定义关联 我选择TextFile错误地 现在我的音乐文件被读取为文本文件 我如何将其转换回music file protected void o
  • Espresso 和 Proguard 的 Java.lang.NoClassDefFoundError

    我对 Espresso 不太有经验 但我终于成功地运行了它 我有一个应用程序需要通过 Proguard 缩小才能处于 56K 方法之下 该应用程序以 3 秒的动画开始 因此我需要等到该动画结束才能继续 这就是我尝试用该方法做的事情waitF
  • 在Android Studio中更改项目主题?

    我使用浅色主题创建了一些项目 现在我想将其更改为深色 但我不知道该怎么做 顺便说一句 我不是问如何在代码中做到这一点 只是问如何更改项目的默认主题 在 AndroidManifest xml 的 application 标签下 您可以设置您
  • Nexus 7 (2013) 和 Win 7 64 - 尽管检查了许多论坛和在线资源,仍无法安装 USB 驱动程序

    我正在尝试设置 Nexus 7 2013 进行调试 但我在安装 USB 驱动程序的步骤中陷入困境 到目前为止 这是我尝试过的 采取的步骤 在 Nexus 7 2013 上打开调试模式 连接设备至 PC 下载 Google USB 驱动程序于
  • Android - 9 补丁

    我正在尝试使用 9 块图片创建一个新的微调器背景 我尝试了很多方法来获得完美的图像 但都失败了 s Here is my 9 patch 当我用Draw 9 patch模拟时 内容看起来不错 但是带有箭头的部分没有显示 或者当它显示时 这部
  • Android AutoCompleteTextView 带芯片

    我不确定我是否使用了正确的词语来描述此 UI 功能 但我已附上我希望在我的应用程序中实现的目标的快照 它由 Go SMS 使用 用户在编辑文本中键入联系人 在用户从完成下拉列表中选择联系人后 该联系人将被插入到编辑文本中 如附图所示 编辑文
  • 按字母顺序过滤 Firestore 数据以对 Google Cloud 中的文档读取进行分类/减少

    基于这样的事实Cloud Firestore 不支持全文搜索 https firebase google com docs firestore solutions search到目前为止 我决定问这个question https stack
  • 在 Android 中使用 iText 将图像添加到特定位置

    我想使用 Android 中的 iText 将图像添加到 PDF 文件中的特定位置 这是一个可填写的表单 我添加了作为图像占位符的文本框 我想要做的就是像这样获取该文本框和图像 public class FormFill public st
  • 当ScrollView滚动到底部时加载更多数据

    我有一个带有动态加载内容的滚动视图 有时可能会有很多内容 所以我想在用户滚动到底部时加载更多内容 我搜索了合适的方法 发现了两种 onScrollChanged and getScrollY 但我不知道如何将它用于我的目的 请给我一些建议

随机推荐

  • iOS:同步相机帧和运动数据

    我正在尝试从相机捕获帧和相关的运动数据 为了同步 我使用时间戳 视频和动作被写入文件然后进行处理 在这个过程中 我可以计算每个视频的运动帧偏移 事实证明 相同时间戳的运动数据和视频数据彼此偏移不同的时间 从 0 2 秒到 0 3 秒不等 该
  • 事件驱动编程是如何实现的?

    我正在研究twisted 和node js 框架是如何工作的 我是 试图准确理解操作系统如何支持 I O 使用回调的操作 我知道这很好 因为我们需要更少的线程 因为我们不需要 需要阻塞线程等待 I O 操作 但有些东西 I O 完成后必须调
  • 计算数字数组的可能排列

    我有一个带有数字 0 1 2 3 的 NSArray 计算 4 的阶乘 数组的计数 我有 24 种可能的排列 0 1 2 3 我想知道是否有一种方法可以计算所有这些可能的排列并将它们放在一个单独的数组中 例如 给定上面的数字 0 1 2 3
  • 在 C# 中将对象转换为 int 会引发 InvalidCastException

    我有这个方法 private static Dossier PrepareDossier List
  • DynamoDB:条件写入与 CAP 定理

    使用 DynamoDB 两个独立的客户端尝试同时写入同一个项目 使用条件写入 并尝试更改条件引用的值 显然 这些写入之一注定会因条件检查而失败 没关系 假设在写入操作期间发生了一些不好的事情 并且某些 DynamoDB 节点出现故障或彼此失
  • Python:使用单词交集而不是字符交集的杰卡德距离

    我没有意识到 Python set 函数实际上将字符串分隔成单个字符 我为Jaccard编写了python函数并使用了python交集方法 我将两个集合传递到此方法中 在将这两个集合传递到我的 jaccard 函数之前 我在设置环上使用 s
  • MVVM 和导航服务

    实现任何模式的众多好处之一是在应用程序的不同层之间分离关注点 对于 Silverlight 和 MVVM 我认为 NavigationService 属于 UI 如果 NavigationService 属于 UI 那么它应该在后面的 XA
  • Ruby 数组 concat 与 + 速度?

    我对 Ruby 数组进行了小型性能测试concat vs 操作和concat 太快了 然而我不清楚为什么concat 有那么快吗 有人可以帮忙吗 这是我使用的代码 t Time now ar for i in 1 10000 ar ar 4
  • 如何将场景缩放至全屏?

    我目前正在学习 Phaser 3 但是 我能找到的所有文档都是关于 Phaser2 的 创建游戏时 您必须在配置中设置宽度和高度 var config type Phaser AUTO width 800 height 600 如何将场景缩
  • 我在微风中未映射的属性似乎不适用于投影

    我有以下实体 public class Invoice Key public int Id get set public DateTime ArchiveDate get set public DateTime ClotureDate ge
  • 从不同路径使用 .babelrc

    有没有办法向 babel cli 提供 babelrc 文件的路径 就像是 babel src out dir lib config random folder sub folder babelrc 您可以将 babelrc 文件放在其他
  • SpriteKit/Metal 内存泄漏但没有任何反应

    我似乎无法追踪内存泄漏 Instruments 看到它 并将其报告为 jet buffer Metal 但我不知道这具体指向什么 它经常发生 我已经尝试了一切 删除我的所有节点 删除物理主体 但它似乎仍然存在 我在更新或任何其他游戏周期方法
  • 是否有一个 JavaScript 引擎可以让我运行我的代码而不必被迫使用浏览器?

    有没有什么方法可以编写和运行 JavaScript 代码 而无需运行浏览器并使用其 JavaScript 引擎 Thanks 我很惊讶还没有人指出这一点 Windows 包含一个可以从命令行使用的 Javascript 引擎 自 Windo
  • 如何让 gitlab-ci-runner DinD 图像缓存中间图像?

    我有一个 Dockerfile 从安装 texlive full 包开始 该包很大并且需要很长时间 如果我docker build它在本地 安装后创建的中间映像会被缓存 后续构建速度很快 但是 如果我推送到我自己的 GitLab 安装并且
  • android listview onItemClickListener 失败

    我使用以下代码来侦听我的列表视图 onItemClick 事件 没有发生编译错误 当我点击任何列表项时什么也没有发生 我不知道为什么Orz 有人能告诉我为什么 吗 mp3 listView setOnItemClickListener ne
  • 填充 NSString 不起作用

    我已阅读该内容以向左填充NSString你需要做的就是这样 NSString paddedStr NSString stringWithFormat 20 20 20 20 aString anotherSting 但是 那是行不通的 我不
  • SwiftUI 中可选数据类型的选择器?

    通常我可以在 SwiftUI 中显示这样的项目列表 enum Fruit case apple case orange case banana struct FruitView View State private var fruit Fr
  • 让 nokogiri 使用较新版本的 libxml2

    我一直试图在我的计算机 Mountain Lion 上安装 Nokogiri 以与 rspec 和 capybara 一起使用 但对于我来说 我无法让它正常运行 据我所知 问题在于 nokogiri 使用了错误版本的 libxml2 到目前
  • 如何在android中以编程方式打开文件夹?

    我正在开发一个打开文件夹的Android应用程序 我的问题是如何在 Android 中以编程方式打开文件夹 我尝试了 stack overflow 中提供的所有解决方案并在 Google 中搜索 但找不到解决方案 有人可以给我答案吗 提前致
  • Wifi 睡眠,即使有锁

    总结 即使获取了wifi锁 当手机使用电池运行时 wifi也会在一段时间后断开 我已将问题简化为带有启动线程的按钮的单个活动 它只是向 PC 上运行的回显服务器发送 100 000 个字符串 每 100 毫秒一个字符串 请参阅下面的代码 我