安卓CPU休眠Timer不执行

在开发中,有时我们需要在后台循环执行一些操作(比如:即时通讯心跳包的发送)。

xml布局文件:


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:onClick="start"
        android:text="开始" />
RelativeLayout>

Activity代码:



import android.app.Activity;
import android.os.Environment;
import android.os.Bundle;
import android.view.View;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

/**
 * 注:确保应用不被杀掉;拔掉充电(或者关闭充电时保持唤醒),锁屏,让CPU进入休眠。
 */
public class MainActivity extends Activity {
    private static final String TAG = MainActivity.class.getSimpleName();
    private String path;
    private static final String NAME_SUFFIX = ".txt";
    private boolean enable;

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

    private void init() {
        if (Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)) {
            path = Environment.getExternalStorageDirectory().getAbsolutePath();
            File file = new File(path);
            if (!file.exists()) {
                file.mkdirs();
            }
            enable = true;
            return;
        }
    }

    public void start(View view) {
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                if (enable) {
                    try {
                        FileWriter filerWriter = new FileWriter(new File(path, "CPUSleep" + NAME_SUFFIX), true);
                        BufferedWriter bufWriter = new BufferedWriter(filerWriter);
                        bufWriter.write(new Date().toString());
                        bufWriter.write("\r\n");
                        bufWriter.close();
                        filerWriter.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }, 0, 1000 * 30);
    }
}

操作说明:

点击开始按钮-》锁屏-》等一段时间-》解锁屏幕

结果:

安卓CPU休眠Timer不执行_第1张图片

结果说明:

1:点击开始按钮, Timer执行,写入了 16:08:15
2:图中可以看到16:08:15-16:12:04之间没有数据 没有执行 写入操作代码 (代码中可以看到每30秒写入一次)
3:当解锁屏幕CPU被唤醒后,Timer继续执行写入了 16:12:04;

解决方案:

1:获取电源锁,让CPU不休眠;(耗电严重,不推荐)
2:用 AlarmManager代替Timer。
说明: Android手机有两个处理器,一个叫Application Processor(AP),一个叫Baseband Processor(BP)。AP是ARM架构的处理器,用于运行Linux+Android系统;BP用于运行实时操作系统(RTOS)。AlarmManager 是 Android 系统封装的用于管理 RTC 的模块,RTC (Real Time Clock) 是一个独立的硬件时钟,可以在 CPU 休眠时正常运行,在预设的时间到达时,通过中断唤醒 CPU。
AlarmManager使用代码:
Intent intent = new Intent();
intent.setAction("");
PendingIntent sender = PendingIntent.getBroadcast(this, 0, intent, 0);
AlarmManager alarm = (AlarmManager) getSystemService(ALARM_SERVICE);
alarm.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), 1000 * 10, sender);
清单文件注册:
 
           
               
           


注:

确保应用不被杀掉;拔掉充电(或者关闭充电时保持唤醒),锁屏,让CPU进入休眠。

你可能感兴趣的:(android)