休眠和唤醒

  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() 获取时间

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值