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

操作说明:

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

结果:


结果说明:

1:点击开始按钮,Timer执行,写入了16:08:152:图中可以看到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进入休眠。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部