休眠和唤醒

原创 2015年11月20日 15:10:12
  1. 系统APP;
  2. 关键点:
    #echo mem >/sys/power/state 使系统进入睡眠
    #echo on > /sys/power/state 使系统从睡眠中唤醒过来

代码:

File file = new File("/sys/power/state");
    try {
     OutputStream os = new FileOutputStream(file);
            os.write("mem\n".getBytes());
            os.close();
            file = null;
        }
        catch(IOException e)
        {
            Log.d(TAG, "Error writing " + file, e);
}

休眠方式二(android4.0以后提供了goToSleep的接口):

import android.os.PowerManager;

PowerManager pm = (PowerManager)activity.getSystemService(Context.POWER_SERVICE);
pm.goToSleep(pm.goToSleep(SystemClock.uptimeMillis()););
//pm.goToSleep(0);使用0参数只会休眠一次,第二次休眠无效
//需要关机重启后才可以再次生效。

唤醒:使用闹钟唤醒,AlarmManager 是 Android 系统封装的用于管理 RTC 的模块,RTC (Real Time Clock) 是一个独立的硬件时钟,可以在 CPU 休眠时正常运行,在预设的时间到达时,通过中断唤醒 CPU。
休眠5分钟后唤醒:

import android.app.PendingIntent;
import android.app.AlarmManager;

Display.appendInfo("休眠时间测试 \n");
Display.appendInfo("系统即将休眠..\n");

Intent intent = new Intent(activity, AlarmReceiver.class);
PendingIntent sender = PendingIntent.getBroadcast(
              activity, 0, intent, 0);

// We want the alarm to go off 30 seconds from now.
Calendar calendar = Calendar.getInstance();     calendar.setTimeInMillis(System.currentTimeMillis());
calendar.add(Calendar.SECOND, 30);

AlarmManager am = (AlarmManager) activity.getSystemService(Context.ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sender);                       

Log.i(TAG,"goToSleep..\n");
goToSleep();
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.os.PowerManager;
import android.os.PowerManager.WakeLock;

//闹钟广播
public class AlarmReceiver extends BroadcastReceiver{

 @Override
 public void onReceive(Context context, Intent intent) 
 {
     Log.e("AlarmReceiver", "onReceive");
    //唤醒屏幕
    //获取电源管理器对象
    PowerManager pm =(PowerManager)context.getSystemService(Context.POWER_SERVICE);
    //获取PowerManager.WakeLock对象,后面的参数|表示同时传入两个值,最后的是调试用的Tag
    WakeLock wl = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "bright");
     //点亮屏幕
     wl.acquire();
    } 
}

AndroidManifest.xml中声明闹钟广播:

<receiver android:name="com.pax.apifunctest.AlarmReceiver" android:process=":remote"/>

下面转自:http://www.xiaoyunduo.org/article/109/

调用 AlarmManager 需要注意的参数
AlarmManager.RTC:硬件闹钟,不唤醒手机(也可能是其它设备)休眠;当手机休眠时不发射闹钟。
AlarmManager.RTC_WAKEUP:硬件闹钟,当闹钟发躰时唤醒手机休眠;
AlarmManager.ELAPSED_REALTIME:真实时间流逝闹钟,不唤醒手机休眠;当手机休眠时不发射闹钟。
AlarmManager.ELAPSED_REALTIME_WAKEUP:真实时间流逝闹钟,当闹钟发躰时唤醒手机休眠;
AlarmManager.POWER_OFF_WAKEUP:能唤醒系统,他是一种关机闹铃,就是说设备在关机状态下也可以唤醒系统,所以我们把它称为关机闹铃。

RTC和ELAPSED最大的差别
前者可以通过修改手机时间触发闹钟事件,后者要通过真实时间的流逝,即使在休眠状态,时间也会被计算。所以上面的代码使用 ELAPSED_REALTIME_WAKEUP
在使用 ELAPSED 时使用 SystemClock.elapsedRealtime() 获取时间
在使用 ETC 时使用 System.currentTimeMillis() 获取时间

android 休眠唤醒机制分析(一)

Android的休眠唤醒主要基于wake_lock机制,只要系统中存在任一有效的wake_lock,系统就不能进入深度休眠,但可以进行设备的浅度休眠操作。wake_lock一般在关闭lcd、tp但系统...
  • harhy
  • harhy
  • 2013年01月22日 08:50
  • 23250

linux 休眠唤醒流程

Linux Suspend主要有以下三步:    1) 冻结用户态进程和内核态任务     2) 调用注册的设备的suspend的回调函数,顺序是按照注册顺序     3) 休眠核心设备和使CPU进入...
  • qwaszx523
  • qwaszx523
  • 2016年09月24日 17:09
  • 826

Linux休眠与唤醒

在Linux中,休眠主要分三个主要的步骤:(1)冻结用户态进程和内核态任务;(2)调用注册的设备的suspend的回调函数;(3)按照注册顺序休眠核心设备和使CPU进入休眠态。      冻结进程是内...
  • liaokesen168
  • liaokesen168
  • 2016年05月06日 16:07
  • 614

Linux进程休眠和唤醒

当进程以阻塞的方式通信,在得到结果前进程会挂起休眠。 为了将进程以一种安全的方式进入休眠,我们需要牢记两条规则: 一、永远不要在原子上下文中进入休眠。 二、进程休眠后,对环境一无所知。唤醒后,必...
  • u011068464
  • u011068464
  • 2013年08月27日 23:35
  • 1105

android 休眠唤醒流程及定位唤醒问题总结

平台信息: 内核:linux 2.6.35 android:2.3.1 CPU:三星S5PV210   就从earlysuspend.c中说起,在early suspend中执行完所有驱动的...
  • hanmengaidudu
  • hanmengaidudu
  • 2013年09月12日 10:33
  • 1890

Android 自动休眠唤醒

这几天研究的内容: **一、自动休眠唤醒的实现. 二、binder机制.(广播既然能实现进程间通信,两者区别?) 三、自定义控件的使用和原理.(benwenbutantao….) 四、动画效果...
  • u012400327
  • u012400327
  • 2015年08月05日 17:49
  • 1524

android /linux休眠与唤醒(二)

如何进入休眠 1. 当所有wake_lock被释放,自动进入休眠; 2. echo mem > /sys/power/state;(也需要等待wake_lock全部释放才能进入suspend)...
  • lbaihao
  • lbaihao
  • 2015年08月14日 20:01
  • 1099

Android休眠唤醒机制简介(二)

在suspend_freeze_processes()函数中调用了freeze_processes()函数,而freeze_processes()函数中又调用了try_to_freeze_tasks(...
  • coldsnow33
  • coldsnow33
  • 2014年01月18日 13:10
  • 6273

linux内核休眠与唤醒

转自:http://blog.csdn.net/zhandoushi1982/article/details/5759050       在Linux中,休眠主要分三个主要的步骤:(1)冻结用户态...
  • njuitjf
  • njuitjf
  • 2014年01月08日 11:36
  • 1922

Android AlarmManager 定时闹钟实现在CPU休眠状态下进行业务操作

面试的时候被问到,在手机CPU休眠状态下实现实时分享当期那位置怎么做?当时也不知道,就瞎说了一通,后面回来直接查询了一下资料,才知道关键技术点没有答到,扯的都是废话,结合资料,来看看大概是怎么实现的吧...
  • xinjiban
  • xinjiban
  • 2015年03月09日 10:07
  • 2302
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:休眠和唤醒
举报原因:
原因补充:

(最多只允许输入30个字)