android休眠后恢复线程,关于Android系统休眠后,线程的执行情况

理论上,android系统休眠后,app进程会被挂起,所以相关的执行线程也会被挂起,那些java线程的操作例如:wait,await,sleep,循环阻塞,handler的delay,线程池的delay操作都会被挂起,因为它们使用的系统计时器在休眠的时候是停止的,例如:SystemClock.uptimeMillis(),其实针对不同版本的android系统这些表现各有不同,有些android系统是休眠后这些计时变慢了,原先计时5秒的,休眠后可能要计时5到6分钟,在android系统中AlarmManager可以解决上述问题,闹钟在系统休眠的时候也会唤醒系统的,闹钟使用的计时器在休眠的时候是继续跑的,例如:SystemClock.elapsedRealtime(),但是闹钟的计时并不是很准确,甚至有秒级别的误差:

1. setRepeating方法是重复的唤醒操作,根据api文档可知系统会对这些做优化,唤醒时间并不会严格的按照你设置的参数时间来执行

2. set方法在sdk版本低于19的实现是严格准确的按照设置的时间唤醒的,但是在sdk版本高于或者等于19的实现是经过优化的,并不会准确按照设置的时间唤醒,所谓的优化就是系统有可能判断到间隔时间很小的有两个闹钟唤醒操作,这时候系统可能就会自动的把比较早的那个闹钟唤醒操作和比较晚的唤醒操作合并为一个

3. 根据api文档说明,想要精确按照设置时间唤醒可采用setExact方法,但是据我真机(小米4C,6.0系统)实测,这个方法的唤醒任然存在较大误差,误差甚至到秒级别,有的会误差几秒钟,只能说基本准确

下面是测试代码:

补充一点:要把alarm和其他的定时测试分开执行,alarm唤醒之后会影响其他线程的测试的

public class MainActivity extends AppCompatActivity {

ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();

int i = 0;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

new Handler(Looper.getMainLooper()).post(new Runnable() {

@Override

public void run() {

Toast.makeText(MainActivity.this, "sss", Toast.LENGTH_SHORT).show();

}

});

scheduledExecutorService.scheduleWithFixedDelay(new Runnable() {

@Override

public void run() {

String format = new SimpleDateFormat("HH:mm:ss").format(new Date());

NotificationUtil.showNotification(MainActivity.this, new Intent(), 100, "ScheduledExecutorService休眠测试", format + ":ScheduledExecutorService执行");

i++;

}

}, 20, 20, TimeUnit.SECONDS);

new Thread() {

@Override

public void run() {

long now;

while (true) {

now = SystemClock.elapsedRealtime();

while (SystemClock.elapsedRealtime() - now < 20000) ;

String format = new SimpleDateFormat("HH:mm:ss").format(new Date());

NotificationUtil.showNotification(MainActivity.this, new Intent(), 101, "Thread休眠测试", format + ":Thread执行");

}

}

}.start();

new Thread() {

@Override

public void run() {

while (true) {

synchronized (this) {

try {

this.wait(20000);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

String format = new SimpleDateFormat("HH:mm:ss").format(new Date());

NotificationUtil.showNotification(MainActivity.this, new Intent(), 102, "wait休眠测试", format + ":wait执行");

}

}

}.start();

Handler handler = new Handler() {

@Override

public void handleMessage(Message msg) {

sendEmptyMessageDelayed(1, 20000);

if (msg.what == 1) {

String format = new SimpleDateFormat("HH:mm:ss").format(new Date());

NotificationUtil.showNotification(MainActivity.this, new Intent(), 103, "handler休眠测试", format + ":handler执行");

}

}

};

handler.sendEmptyMessageDelayed(1, 20000);

new Thread(){

@Override

public void run() {

while (true) {

try {

sleep(20000);

} catch (InterruptedException e) {

e.printStackTrace();

}

String format = new SimpleDateFormat("HH:mm:ss").format(new Date());

NotificationUtil.showNotification(MainActivity.this, new Intent(), 104, "sleep休眠测试", format + ":sleep执行");

}

}

}.start();

startService(new Intent(this, TestService.class));

}

}

public class TestService extends Service {

ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();

@Nullable

@Override

public IBinder onBind(Intent intent) {

return null;

}

@Override

public void onCreate() {

super.onCreate();

HandlerThread handlerThread = new HandlerThread("ht");

handlerThread.start();

Handler handler = new Handler(handlerThread.getLooper());

handler.post(new Runnable() {

@Override

public void run() {

while (true) {

try {

Thread.sleep(20000);

} catch (InterruptedException e) {

e.printStackTrace();

}

scheduledExecutorService.schedule(new Runnable() {

@Override

public void run() {

String format = new SimpleDateFormat("HH:mm:ss").format(new Date());

NotificationUtil.showNotification(TestService.this, new Intent(), 105, "Service休眠测试", format + ":Service执行");

}

}, 0, TimeUnit.SECONDS);

}

}

});

Intent intent = new Intent(this, InnerGuardReceiver.class);

intent.setAction("com.xtc.watch.guard.push");

PendingIntent pendingIntent = PendingIntent.getBroadcast(this, -1001, intent, 0);

AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

alarmManager.cancel(pendingIntent);

alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 20000, 20000, pendingIntent);

}

@Override

public int onStartCommand(Intent intent, int flags, int startId) {

return super.onStartCommand(intent, flags, startId);

}

public static class InnerGuardReceiver extends BroadcastReceiver {

@Override

public void onReceive(Context context, Intent intent) {

String format = new SimpleDateFormat("HH:mm:ss").format(new Date());

NotificationUtil.showNotification(context, new Intent(), 106, "alarm休眠测试", format + ":alarm执行");

}

}

}

上面除了alarm会按时唤醒执行,其他的在手机休眠后计时变慢了,休眠越久,误差时间就拉的越大,都是20秒的定时任务,休眠后,除了alarm,其他的误差慢慢变大,例如一开始是30秒,然后1分钟,3分钟,5分钟,10分钟,16分钟等等,但是这些计时延迟的时间都基本一直,说明除了alarm,其他使用的系统计时器都是一致的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/428904.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1011 A+B 和 C (15 分)

1011 AB 和 C (15 分) 给定区间 [−2 ​31 ​​ ,2 ​31 ​​ ] 内的 3 个整数 A、B 和 C&#xff0c;请判断 AB 是否大于 C。 输入格式&#xff1a; 输入第 1 行给出正整数 T (≤10)&#xff0c;是测试用例的个数。随后给出 T 组测试用例&#xff0c;每组占一行&#xff0c;…

java-上传文件与现实上传文件

项目结构&#xff1a; 项目展示&#xff1a; 数据库&#xff1a; /* SQLyog Ultimate v12.09 (64 bit) MySQL - 5.5.53 : Database - fileupload ********************************************************************* *//*!40101 SET NAMES utf8 */;/*!40101 SET SQL_MODE*…

1012 数字分类 (20 分)

1012 数字分类 (20 分) 给定一系列正整数&#xff0c;请按要求对数字进行分类&#xff0c;并输出以下 5 个数字&#xff1a; A ​1 ​​ 能被 5 整除的数字中所有偶数的和&#xff1b; A ​2 ​​ 将被 5 除后余 1 的数字按给出顺序进行交错求和&#xff0c;即计算 n ​1 ​…

BZOJ2948 : [Poi2001]绿色游戏

维护一个保护集合$S$&#xff0c;表示哪些点$A$可能胜利。 首先将所有绿点加入$S$。 $1.$对于一个不在$S$的$A$点&#xff0c;若它存在某个后继在$S$中&#xff0c;则将其加入$S$。 $2.$对于一个不在$S$的$B$点&#xff0c;若它所有后继都在$S$中&#xff0c;则将其加入$S$。 通…

登录微信用android设备,Android 之微信登录

准备工作需要在微信开放平台注册登录账户。还得办理开发者资质认证&#xff0c;审核费用为300元。2.在微信开放平台创建移动应用&#xff0c;填写相关信息后提交审核。简述业务流程1.获取appId和secret2.通过appId和secret调微信接口获取 code3.通过code和getAccessToken()方法…

1013 数素数 (20 分)

1013 数素数 (20 分) 令 P ​i ​​ 表示第 i 个素数。现任给两个正整数 M≤N≤10 ​4 ​​ &#xff0c;请输出 P ​M ​​ 到 P ​N ​​ 的所有素数。 输入格式&#xff1a; 输入在一行中给出 M 和 N&#xff0c;其间以空格分隔。 输出格式&#xff1a; 输出从 P ​M ​​…

《浅谈CT》总结

注明来自 http://www.ssdfans.com/?p1941 这里说的CT&#xff0c;不是医院里面的CT&#xff0c;而是闪存的一种技术&#xff1a;Charge Trap。 闪存不只有Floating Gate&#xff0c;还有Charge Trap。 浮栅极材料是导体&#xff0c;一般为多晶硅。 CTF&#xff08;Charge Trap…

android可见区域,识别目标View在HorizontalScrollView可见区域

完成需求的时候涉及到这个所以撸了一下本文章是本人原创&#xff0c;转载请带原地址连接先放效果图(霁雪清虹"是目标)&#xff1a;首先需要一个自定义HorizontalScrollView&#xff0c;复写一个View的onScrollChanged方法&#xff0c;用于监听滑动变化代码如下&#xff1a…

1015 德才论 (25 分)

1015 德才论 (25 分) 宋代史学家司马光在《资治通鉴》中有一段著名的“德才论”&#xff1a;“是故才德全尽谓之圣人&#xff0c;才德兼亡谓之愚人&#xff0c;德胜才谓之君子&#xff0c;才胜德谓之小人。凡取人之术&#xff0c;苟不得圣人&#xff0c;君子而与之&#xff0c…

AI单挑Dota 2世界冠军:被电脑虐哭……

OpenAI的机器人刚刚在 Dota2 1v1 比赛中战胜了人类顶级职业玩家 Denti。以建设安全的通用人工智能为己任的 OpenAI&#xff0c;通过“Self-Play”的方式&#xff0c;从零开始训练出了这个机器人。 Dota2沦陷 继横扫顶级的人类国际象棋大师和围棋大师后&#xff0c;计算机如今在…

用session实现html登录页面跳转页面跳转页面跳转,js判断登录与否并确定跳转页面的方法...

这篇文章主要介绍了js判断登录与否并确定跳转页面的方法,涉及Ajax及session使用的技巧,非常具有实用价值,需要的朋友可以参考下本文实例讲述了js判断登录与否并确定跳转页面的方法。分享给大家供大家参考。具体如下&#xff1a;使用session存储&#xff0c;确定用户是否登录&am…

7-26 Windows消息队列(25 分)

7-26 Windows消息队列&#xff08;25 分&#xff09; 消息队列是 Windows 系统的基础。对于每个进程&#xff0c;系统维护一个消息队列。如果在进程中有特定事件发生&#xff0c;如点击鼠标、文字改变等&#xff0c;系统将把这个消息加到队列当中。同时&#xff0c;如果队列不…

Java——操作集合的工具类:Collections

Java 提供了一个操作 Set 、List 和 Map 等集合的工具类 &#xff1a;Collections&#xff0c;该工具类里提供了大量方法对集合元素进行排序、查询和修改等操作 转载于:https://www.cnblogs.com/szj-ang/p/7383027.html

鸿蒙关键技术研究,华为鸿蒙 2.0 系统主题演讲公布,详细架构 9 月 11 日揭晓

IT之家 8 月 30 日消息 华为 9 月 10 日将举行华为开发者大会 2020&#xff0c;华为官网表示&#xff0c;“我们将与您分享 HMS Core 5.0 最新进展&#xff0c; 揭开 HarmonyOS 和 EMUI 11 的神秘面纱。 振奋人心的新技术&#xff0c;深入的交流学习机会&#xff0c; 更灵动的想…

shell 提示符个性化设置

提示符具体含义可参考&#xff1a; http://billie66.github.io/TLCL/book/zh/chap14.html Ubuntu16.04个人配置如下&#xff0c;供以后查阅 1 function git_branch {2 branch"git branch 2>/dev/null | grep "^\*" | sed -e "s/^\*\ //""3…

如何设置鼠标滚轮html,win7如何设置鼠标滚轮

你们知道在W7中怎么设置鼠标的滚轮吗?下面是小编带来的关于win7如何设置鼠标滚轮的内容&#xff0c;欢迎阅读!Win7设置滚轮方法一&#xff1a;首先要在电脑的左下角点击开始按钮点击开始按钮以后出现上拉菜单&#xff0c;在菜单上面点击控制面板点击控制面板以后进入到控制面板…

湛江高考2021成绩查询,2021广东省高中学业水平考试成绩查询(入口+方式)

2021年广东高中学业水平合格性考试成绩查询查询方式&#xff1a;考生登录广东省教育考试服务中心的广东教育考试服务网&#xff0c;通过综合查询栏目页面&#xff0c;按相关提示即可查询考试成绩。查询入口二&#xff1a;“广东省教育考试院”小程序查询方式&#xff1a;①在“…

A. Red and Blue Beans

题意&#xff1a;红豆子和绿豆子分在不同的篮子里。问最小的最大差是能不能比给的d小。 方法&#xff1a;尽可能用更多的篮子里。 #include<iostream> using namespace std; int main() {double a,b,k;int n;cin>>n;for (int i0;i<n;i){cin>>a>>b&…

JAVA经典算法40题

【程序1】 题目&#xff1a;古典问题&#xff1a;有一对兔子&#xff0c;从出生后第3个月起每个月都生一对兔子&#xff0c;小兔子长到第四个月后每个月又生一对兔子&#xff0c;假如兔子都不死&#xff0c;问每个月的兔子总数为多少&#xff1f; 1.程序分析&#xff1a; 兔子…

中英对照 关于计算机的科技英语,《计算机专业英语》(中英文对照).pdf

《计算机专业英语》(中英文对照)计算机专业英语Computer EnglishChapter 1 The History andFuture of Computers2009.9.1Chapter 1 The History and Future of ComputersKey points:Key points:useful terms and definitions ofuseful terms and definitions ofcomputerscomput…