转发请注明出处:
http://blog.csdn.net/codectq/article/details/7324879
最近,在学习让系统进入休眠的过程中,学习了电源管理的相关知识。为了备忘和理清思路现整理成文,以便日后查阅。
移动设备由于自身的限制有一个硬伤就是电量的消耗问题。由于电池的电量有限,所以电源电量的管理显得就比较重要了。我们可以想象一下,当你去超市买完东西之后,却发现无法运回家,是多么难受的一件事情。
Android的电源管理是在Linux电源管理的基础之上更好的一个电源管理方案,在这种策略下,通过Android framework层和本地的linux库,服务和应用都通过“wake lock”来取得CPU,从而达到省电的目的。如果没有活跃的唤醒锁,Android将关闭CPU。
在Android4.0中,为上层提供的休眠函数为goToSleep()。下面详细讲解为什么这个命令会让系统进去休眠模式。
首先,需要明白在Android系统中一般会有这样的一个文件群,XXX.java、XXXservice.java、*XXX*.cpp、*XXX*.c。作为使用者我们首先需要了解的就是这个系统能够为我们提供的服务,如果这些服务会让我们满意,我们才会愿意为这个服务埋单。因此,在这里我们就先从服务入手,也就是从PowerManagerService.java开始入手。在这个文件的line2561出有goToSleep()函数的定义:
public void goToSleep(long time)
{
goToSleepWithReason(time, WindowManagerPolicy.OFF_BECAUSE_OF_USER);
}
goToSleep()函数接着调用了下面的goToSleepWithReason()函数。函数的定义如下:
public void goToSleepWithReason(long time, int reason)
{
mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null);
synchronized (mLocks) {
goToSleepLocked(time, reason);
}
}
goToSleepLocked()函数的定义如下:
private void goToSleepLocked(long time, int reason) {
if (mLastEventTime <= time) {
mLastEventTime = time;
// cancel all of the wake locks
mWakeLockState = SCREEN_OFF;
int N = mLocks.size();
int numCleared = 0;
boolean proxLock = false;
for (int i=0; i<N; i++) {
WakeLock wl = mLocks.get(i);
if (isScreenLock(wl.flags)) {
if (((wl.flags & LOCK_MASK) == PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK)
&& reason == WindowManagerPolicy.OFF_BECAUSE_OF_PROX_SENSOR) {
proxLock = true;
} else {
mLocks.get(i).activated = false;
numCleared++;
}
}
}
if (!proxLock) {
mProxIgnoredBecauseScreenTurnedOff = true;
if (mDebugProximitySensor) {
Slog.d(TAG, "setting mProxIgnoredBecauseScreenTurnedOff");
}
}
EventLog.writeEvent(EventLogTags.POWER_SLEEP_REQUESTED, numCleared);
mStillNeedSleepNotification = true;
mUserState = SCREEN_OFF;
setPowerState(SCREEN_OFF, false, reason);
cancelTimerLocked();
}
}
其中,对我们来讲最有意义的函数为setPowerState()函数。此函数中调用了setScreenStateLocked()函数
转发请注明出处:
http://blog.csdn.net/codectq/article/details/7324879
private int setScreenStateLocked(boolean on) {
if (DEBUG_SCREEN_ON) {
RuntimeException e = new RuntimeException("here");
e.fillInStackTrace();
Slog.i(TAG, "Set screen state: " + on, e);
}
if (on) {
if ((mPowerState & SCREEN_ON_BIT) == 0 || mSkippedScreenOn) {
// If we are turning the screen state on, but the screen
// light is currently off, then make sure that we set the
转发请注明出处:
http://blog.csdn.net/codectq/article/details/7324879
// light at this point to 0. This is the case where we are
// turning on the screen and waiting for the UI to be drawn
// before showing it to the user. We want the light off
// until it is ready to be shown to the user, not it using
// whatever the last value it had.
if (DEBUG_SCREEN_ON) {
Slog.i(TAG, "Forcing brightness 0: mPowerState=0x"
+ Integer.toHexString(mPowerState)
+ " mSkippedScreenOn=" + mSkippedScreenOn);
}
mScreenBrightness.forceValueLocked(Power.BRIGHTNESS_OFF);
}
}
int err = Power.setScreenState(on);
if (err == 0) {
mLastScreenOnTime = (on ? SystemClock.elapsedRealtime() : 0);
if (mUseSoftwareAutoBrightness) {
enableLightSensorLocked(on);
转发请注明出处:
http://blog.csdn.net/codectq/article/details/7324879
if (!on) {
// make sure button and key backlights are off too
mButtonLight.turnOff();
mKeyboardLight.turnOff();
// clear current value so we will update based on the new conditions
// when the sensor is reenabled.
mLightSensorValue = -1;
// reset our highest light sensor value when the screen turns off
mHighestLightSensorValue = -1;
}
}
}
return err;
}
转发请注明出处:
http://blog.csdn.net/codectq/article/details/7324879
此函数调用了Power类中的setScreenState()函数。此函数通过JNI机制,最终到达硬件层的libhardware_legacy/power/Power.c文件通过对寄存器的操作完成对休眠的操作。在此函数中我们通过传入的参数是on,来进行相应的处理。
分享到:
相关推荐
通过Power事件实现设备的强制休眠和唤醒,demo是测试通过(需root)
利用PowerManager中 goToSleep和wakeUp方法实现手机强制休眠和唤醒,demo已测试通过
Unity调用Android系统PowerManager类相关的功能(关机、重启、睡眠、唤醒),需要系统签名。
顾名思义,PowerManager.java就是管理我们电源方面的功能的,当然也包括我们屏幕的亮和熄灭。没错,我们的应用程序就是通过这个系统服务来实现亮屏和熄屏的功能的。 1. 应用程序获取PowerManager服务, 我们可以这样...
采用JNI技术加C语言 写的java的电源管理类, 可实现关机重启,快速关机重启注销,可直接只用,并非采用简单的命令行关机!
15版联想t450电源管理软件win7powermanager[n14u406w],实用于win7系统。
完整的Android电源管理、电量信息显示例子,包括整个工程,导入IDE即可使用。
最后通过 PowerManager.WakeLock 在屏幕休眠后保持cpu唤醒状态以使得service继续运行。 官网提醒:这个API会加剧耗电,所以在非必要情况下尽量不要使用。如果要使用尽量使用最低的等级,并在退出后释放资源。 wake ...
Android 电源管理 -- wakelock机制,通过控制wakelock 实现保持pad 禁止休眠状态; Wake Lock是一种锁的机制, 只要有人拿着这个锁,系统就无法进入休眠, 可以被用户态程序和内核获得. 这个锁可以是有超时的 或者 是...
在使用一些产品列如微信、QQ之类的,如果有新消息来时,手机屏幕即使在锁屏状态下也会亮起并提示声音,这时用户就...答案就是Android中的WakeLock机制。 首先看看官方的解释: PowerManager:This class gives you co
Thinkpad Power Manager是联想官方推出的Thinkpad系列笔记本的一款电源管理软件,Thinkpad电源管理软件通过软件、硬件的配合,对笔记本电脑各部件的性能及功耗进行优化与控制,有效延长电脑电池的使用时间,增强电池...
Thankpad t420i 电源管理win8 x64亲测可用,电源管理,win8 x64,Thankpad t420i PowerManager
手机锁屏后,Android系统为了省电以及减少CPU消耗,在一段时间后会将手机进入休眠状态。此时的服务以及线程等都会停止。 最近就这个问题,阅读了很多代码以及官方文档,下面就说下最近都尝试过的方式,可能其中有些...
基于PicoVR Unity SDK实现调用Android系统PowerManager类相关的功能 Unity调用Android系统PowerManager类功能
实现系统重启的APK需要system的权限,在AndroidManifest.xml中增加android:sharedUserId=”android.uid.system”,再修改签名即可; 具体方法参考: 点击打开链接 1、使用PowerManager来实现:代码: 代码如下:...
IBM笔记本电池管理软件,XP应用。。。
Android, the next-generation open mobile platform from Google and the Open Handset Alliance, is poised to become a significant player in the mobile device market. The Android platform gives developers...
做Android应用开发时,有时需要在应用前台运行时,禁止休眠,以下几种方法供参考。 方法一:持有WakeLock 添加休眠锁,休眠锁必须成对出现。 private WakeLock mWakeLock = null; private void acquireWakeLock() {...
Android中提供了一个名为WakeLock的类在android.os.PowerManager.WakeLock中,从名字来看WakeLock是唤醒锁的意思,它可以控制屏幕的背光开关,所以在电源管理类。 WakeLock实例化方法比较简单,因为是系统的远程...