Android 连接到笔记本电脑时的不同行为

Android 连接到笔记本电脑时的不同行为,android,battery,Android,Battery,我编写了一个应用程序,记录来自智能手机传感器的数据。 我有一个线程,每小时将这些数据写入一个文件。 当连接到我的笔记本电脑时,该应用程序运行良好。每小时创建一个新文件 但当智能手机与笔记本电脑断开连接时,它不会这样做。它没有崩溃,但应用程序运行了一整夜,只创建了一个文件 我的代码使用Thread.sleep,这是一个问题吗 我正在用安卓4.4.4测试Nexus5 @Override public void run() { String filename =

我编写了一个应用程序,记录来自智能手机传感器的数据。 我有一个线程,每小时将这些数据写入一个文件。 当连接到我的笔记本电脑时,该应用程序运行良好。每小时创建一个新文件

但当智能手机与笔记本电脑断开连接时,它不会这样做。它没有崩溃,但应用程序运行了一整夜,只创建了一个文件

我的代码使用Thread.sleep,这是一个问题吗

我正在用安卓4.4.4测试Nexus5

    @Override
    public void run()
    {
        String filename = "";
        String directory = "";
        Date now = new Date();

        while (!stopped)
        {
            Log.i(TAG, "Start the one hour sleep");
            sleepForOneHour(now);
            now = new Date();

            directory = directoryDateFormat.format(now);
            filename = filenameDateFormat.format(now);

            Log.i(TAG, "Write data to SD-card");
            setFileWriteDirectory(directory);
            writeDataToSdCard(filename);
        }
        super.run();
    }

    private void sleepForOneHour(Date filesWritten)
    {
        Date now = new Date();
        long nowMillies = now.getTime();
        long filesWrittenMillies = filesWritten.getTime();

        long passedMillies = (nowMillies - filesWrittenMillies);

        long milliesPerHour = (60 * 60 * 1000);

        long waitMillies = (milliesPerHour - passedMillies);

        try
        {
            sleep(waitMillies);
        } catch (InterruptedException e)
        {
            Log.d(TAG, "Interrupted sleep in filehandler thread");
        }
    }
更新


我试着用Android.Timer代替Thread.sleep,但结果是一样的。

以下是一些有根据的猜测和建议

智能手机在未使用功能时具有一些非常严格的断电功能。其中一些功能将关闭不重要的中断

检查您的睡眠呼叫使用的时钟。一些计时器的基础是时钟滴答声,当处于低功率状态时,时钟滴答声也会减慢,有时甚至停止

检查是否有一些特殊的线程调用,您需要保持线程运行,包括在手机处于低功耗状态时从睡眠中醒来


关于

当手机未连接到笔记本电脑时,某些线程似乎不再执行。计时器和睡眠线程显然是其中之一

对我来说,解决办法是使用唤醒锁。这确实会严重影响功耗

在我的主要活动中,我获得了这样一个唤醒锁

private static WakeLock lockStatic;

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    PowerManager mgr = (PowerManager) this.getSystemService(Context.POWER_SERVICE);
    lockStatic = mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
    lockStatic.setReferenceCounted(true);
    lockStatic.acquire();
    ...
}
我在onDestroy中释放wakelock。这是不推荐的,因为这会导致电池消耗更快,但我使用手机作为一个专用的记录设备,所以我不太关心电池寿命

@SuppressLint("Wakelock")
@Override
protected void onDestroy()
{
    ...
    lockStatic.release();
    super.onDestroy();
}