Android休眠锁的机制参考:http://blog.csdn.net/sfrysh/article/details/6608118,讲的挺详细的。
知道系统锁是把申请锁的拥有者的PARTIAL_NAME传到底层写入/sys/power/wake_lock,而如果想释放锁则会把PARTIAL_NAME写入/sys/power/wake_unlock,则会从/sys/power/wake_lock移除,而系统是在检测/sys/power/wake_lock没有锁时就会进入休眠状态,正在运行的进程进入冻结状态,唤醒之后在冻结状态处继续运行。
利用这个,在些特殊时候(系统休眠前)可以实现自己人为的去锁住系统,然后做一些操作之后释放锁,让系统休眠:
private static final String wake_lock_fileName="/sys/power/wake_lock";
private static final String wake_unlock_fileName="/sys/power/wake_unlock";
private static final String bluetooth_lockTag="BlueToothLock";
//把自己标签写入/sys/power/wake_lock,系统发现/sys/power/wake_lock有锁的拥有者(写入的标签)就不会休眠。
private void setHardWakeLock(){
FileWriter writer;
try {
writer = new FileWriter(wake_lock_fileName, true);
writer.write(bluetooth_lockTag);
writer.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//把自己标签写入/sys/power/wake_unlock,系统会把标签从/sys/power/wake_lock移除,系统检测没有其他锁就会进入休眠
private void releaseHardWakeLock(){
FileWriter writer;
try {
writer = new FileWriter(wake_unlock_fileName, true);
writer.write(bluetooth_lockTag);
writer.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
setHardLocked = false;
}
//判断是否有其他锁(出自己加入的标签之外)的拥有者存在,不存在表明系统要进入休眠状态了。
private boolean shouldSystemWakeup(){
File file = new File(wake_lock_fileName);
Reader reader = null;
int tempchar;
String buffer = new String();
Log.e("goalone","shouldSystemWakeup");
try {
FileInputStream in = new FileInputStream(file);
reader = new InputStreamReader(in);
try {
while ((tempchar = reader.read()) != -1) {
buffer += String.valueOf((char)tempchar);
}
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Log.v("goalone","buffer: "+buffer+" len: "+ buffer.length()+" taglen: " + bluetooth_lockTag.length());
if (buffer.length() <= (bluetooth_lockTag.length() + 2)) {
String getValue = buffer.trim();
Log.v("goalone","getValue: "+getValue);
if (bluetooth_lockTag.equals(getValue)) {
return false;
}
}
return true;
}
结合广播ACTION_SCREEN_ON和ACTION_SCREEN_OFF,就可以在灭屏之后,系统即将进入休眠状态时,做些特殊操作,而在亮屏后针对休眠前的操作做对应的操作,保持前后状态一致。