- 系统APP;
- 关键点:
#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() 获取时间