刚在做手机自动化测试的过程中,发现手机深度睡眠后会出现以下问题

先来了解一下Windows下的睡眠功能:

电脑在 睡眠状态时,将切断除内存外其他硬件配件的电源,工作状态的数据将保存在内存中,这样在重新唤醒电脑时,就可以快速恢复睡眠前的工作状态。

Linux系统下的睡眠功能:

Linux操作系统的睡眠有两种方式:mem和standby ,这两种方式都是suspend to RAM,简称STR,只是standby耗电更多一些,返回到正常工作方式时间更短一些而已。

实现的方法也是将系统状态的数据保存到内存,唤醒时再从内存读数据。

Android下的睡眠:

Android并不是真正的系统,用的是Linux核心,也就是基于Linux核心,更类似于应用平台。所以,如果是依据Windows和Linux操作系统下的睡眠理论来说,Android本身并不具有睡眠的功能,也就不存在“深度睡眠”这种说法。再根据Android平台架构体系,如果Linux核心进入睡眠了,那么Android这个平台的一切功能都将丧失。

那么当关闭手机屏幕,长期未使用手机时,Android平台又是处于什么样的状态呢?

来做一个简单的实验,打开Eclipse,并将手机连到电脑上,观察DDMS和LogCat:

1、并关闭屏幕,起初,从LogCat中可以观察到手机上的一切进程还是照样运行,手机上的网络也还是通的。

2、过一段时间后,这个时间不确定性,每个手机所反映出来的结果会不一样,从LogCat中可以观察到手机上的网络会被断开,部份应用可能会被注销,但笔者运行的一个服务还是照样在运行;

3、再过一段时间后,这个时间较长,半个小时以上,发现电脑已经检测不到手机的信息,从DDMS里面反映出来连接上的是未知设置。

4、当重新开启屏幕后,再次连上手机时,发现笔者用于测试的那个进程照样还在运行,并未结束掉。

由于测试环境有限,只能在有限的几部不同型号的手机进行测试,当手机长期未使用的时间,手机的不常用的硬件可能会断电,比如网络、USB接口、摄像头、蓝牙、GPS等...,或者说是这些相应的系统服务被关闭。但手机并未进入“睡眠”状态,顶多可以假设为是“休眠”状态。

以下是个人愚见:

1. 首先启动一个service  在service 从启动一个线程(while(true)类型),在线程中  mgr.setRepeating(AlarmManager.RTC_WAKEUP,
                calendar.getTimeInMillis(), 20 * 1000, pi); 看出这个时钟会每隔20 秒钟唤醒一次手机,而这个线程也会被唤醒,  pttRunobject.wait(1000 * downtime_1);, 看到了吗(重点在这,这个wait 只记录手机被唤醒的时间,在手机深度睡眠之后,线程等待的时间是不走的)意思是wait 只计算手机被持锁的时间,如果不持有锁, 手机会立马又睡下去 。


    public class MyThread implements Runnable {
        int uptime_1 = 3;
        int downtime_1 = 3;
        int printtime_1 = 5;

public MyThread(int downtime, int uptime, int printtime) {
            uptime_1 = uptime;
            downtime_1 = downtime;

AutoTestLogUtils.logPtt("MyThread oncreate.........");
        }

public void run() {

AutoTestUtil.scheduleAlarms(mContext, downtime_1, uptime_1);
            while (pttRunflag) {
                synchronized (pttRunobject) {

AutoTestUtil.sendKeyDownCode(KeyEvent.KEYCODE_PTT);
                    try {
                        pttRunobject.wait(1000 * uptime_1);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    AutoTestLogUtils.logPtt("ptt down end and up start");
                    AutoTestUtil.sendKeyUpCode(KeyEvent.KEYCODE_PTT);

try {
                        pttRunobject.wait(1000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }

AutoTestLogUtils.logPtt("ptt up end and end key  start");
                    
                    AutoTestUtil.sendKeyDownAndUpCode(KeyEvent.KEYCODE_ENDCALL);

// 唤醒时间空白时间,
                    AutoTestUtil.scheduleAlarms(mContext, downtime_1, uptime_1);
                    
                    try {
                        pttRunobject.wait(1000 * downtime_1);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    AutoTestLogUtils.logPtt("ptt end key end anddown key  start");

}
            }
        }
    }

    public static void scheduleAlarms(Context ctxt,int downTime,int upTIme) {
        AlarmManager mgr = (AlarmManager) ctxt
                .getSystemService(Context.ALARM_SERVICE);
        Intent intent2 = new Intent(ctxt, BootReceiver.class);
        intent2.putExtra(AutoTestUtil.PTT_DOWN_TIME,
                Integer.valueOf(downTime));
        intent2.putExtra(AutoTestUtil.PTT_UP_TIME,
                Integer.valueOf(upTIme));
        intent2.setAction(AutoTestUtil.WAKE_UP_DEVICES_ACTION);
        PendingIntent pi = PendingIntent.getBroadcast(ctxt, 0, intent2, 0);
        mgr.cancel(pi);
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());
        calendar.add(Calendar.SECOND, 60);

mgr.setRepeating(AlarmManager.RTC_WAKEUP,
                calendar.getTimeInMillis(), 20 * 1000, pi);

}

在onReceive 中

            pManager = ((PowerManager) context.getSystemService(context.POWER_SERVICE));  
            WakeLock mWakeLock = pManager.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK  
                    | PowerManager.ON_AFTER_RELEASE, TAG);  
            mWakeLock.acquire(30*1000);
            mWakeLock.release();


总结:类似推测手机深睡眠后,上层的ap 应该是死的,只有接到了底层art 时钟信号才被唤醒。


关于android 深度睡眠的认识相关推荐

  1. Android唤醒锁作用,Android深度睡眠和唤醒锁

    我创建了一款在所有手机中运行良好的Android应用程序.但在我的阿尔卡特手机中,手机并未进入深度睡眠模式,数据网络出现故障,因此应用程序无法获取数据网络,也无法同步服务器中的数据.Android深度 ...

  2. Android自动待机和唤醒,Android深度睡眠和唤醒锁

    我创建了一个在所有手机上均可正常运行的android应用.但是在我的阿尔卡特手机中,手机无法进入深度睡眠模式,且数据网络出现故障,因此应用程序无法获取数据网络,也无法同步服务器数据. 我的设计 - S ...

  3. android休眠 wifi唤醒,Android深度睡眠和唤醒锁

    我创建了一个在所有手机上均可正常运行的android应用.但是在我的阿尔卡特手机中,手机无法进入深度睡眠模式,且数据网络出现故障,因此应用程序无法获取数据网络,也无法同步服务器数据. 我的设计 - S ...

  4. android深度睡眠对广播有什么影响吗,解析智能床垫真的有效提升23.3%的深度睡眠吗?...

    随着人们对深度睡眠和睡眠健康的关注,人们也越来越想了解自己的睡眠状况和睡眠数据.于是,智能监测睡眠的产品应运而生,甚至如雨后春笋般出现.用户通过监测产品显示的深度睡眠时间长短来判断自己的睡眠质量,那么 ...

  5. android深度睡眠对广播有什么影响吗,为什么WakefulBroadcastReceiver不能将我的设备从深度睡眠中唤醒?...

    我正在使用唤醒服务的WakefulBroadcastReceiver唤醒我的设备.该服务启动一个活动,并在最后通知WakefulBroadcastReceiver结束作业.我做了一个日志文件,我什么都 ...

  6. 研究 termux 时遇到的诡异的问题

    想法 手上有个旧的Android 手机 MI 5 plus闲置了两年,性能还相当不错的,就是屏幕被我摔花了,最近总想着让他发挥点价值. 突然想到能不能用它当小型Linux服务器放在家里,用内网穿透工具 ...

  7. linux设备进入睡眠所需时间,android linux 休眠 深度睡眠 查看 方法 调试【转】

    在Android移动设备中,有时按下Power键(未接电源,USB)时,因其它apk程序获取了wake_up锁未释放或程序BUG导致未释放,造成未能进入深度睡眠, 从而加大了耗电量,减少了待机时间,参 ...

  8. Android 关于所谓的 深度睡眠 的问题

    以下是笔者愚见: 先来了解一下Windows下的睡眠功能: 电脑在 睡眠状态时,将切断除内存外其他硬件配件的电源,工作状态的数据将保存在内存中,这样在重新唤醒电脑时,就可以快速恢复睡眠前的工作状态. ...

  9. android linux 休眠 深度睡眠 查看 方法 调试

    在Android移动设备中,有时按下Power键(未接电源,USB)时,因其它apk程序获取了wake_up锁未释放或程序BUG导致未释放,造成未能进入深度睡眠, 从而加大了耗电量,减少了待机时间,参 ...

最新文章

  1. Linux下Postfix的配置和使用
  2. C语言基础(12)-输入和输出
  3. 反欺诈中所用到的机器学习模型有哪些?
  4. codeforce A. Design Tutorial: Learn from Math
  5. office默认设置
  6. 如何判断一个对象是否是数组。
  7. 远程桌面mstsc /console(/admin) 的运用
  8. 如何用Pygame写游戏(十四)
  9. 用户不在sudoers文件中的解决方法 .
  10. 解决vue中双击事件会触发两次单击事件问题
  11. 兜兜转转躲不命运轮回---Java基础学习笔记2
  12. 2022年通用航空行业研究报告
  13. 逆天神器!“国外“最新版本,直接一键破解所有WiFi密码,傻眼了!
  14. 创建本地版PACS系统
  15. combo 技术简单介绍
  16. 【无标题】【思特奇杯·云上蓝桥-算法集训营】第1周
  17. Java项目:毕业论文管理系统(java+SSM+JSP+Tomcat+mysql)
  18. 合力提升技术管网治网能力,共同为长三角的数字化发展贡献网信力量
  19. flink yarn-per-job作业提交
  20. 前向传播算法(Forward propagation)与反向传播算法(Back propagation)

热门文章

  1. 时代变迁的缩影:从天涯BBS的沦落,到媲美EXCEL的WPS后辈的腾达
  2. Java继承相关练习
  3. 从事erp行业人员职业发展过程
  4. UML中关联关系和依赖关系的区别
  5. 2017 IAI国际创享节第二日:创享不止,精彩继续
  6. 工程数学_复矩阵求导
  7. PSE供电PD设备网口接法
  8. 杭州内推 | 阿里巴巴CRO线招聘语音方向高级算法工程师
  9. 南大计算机生物信息学,机器学习与数据挖掘-南京大学计算机系.PDF
  10. 基于pytorch的DCGAN代码实现(DCGAN基本原理+代码讲解)