安卓CPU休眠Timer不执行

来源:互联网 发布:淘宝设计 编辑:程序博客网 时间:2024/06/05 17:20
在开发中,有时我们需要在后台循环执行一些操作(比如:即时通讯心跳包的发送)。

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);    }}

操作说明:

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

结果:


结果说明:

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);
清单文件注册:
 <receiver android:name="">
            <intent-filter>
                <action android:name="" />
            </intent-filter>
</receiver>

注:

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

1 0
原创粉丝点击