2019独角兽企业重金招聘Python工程师标准>>>

android的wake_lock介绍

分类:            电源管理            2011-07-15 11:36    18348人阅读    评论(1)    收藏    举报

androidframeworksstringjniserviceos

Wake Lock是一种锁的机制, 只要有人拿着这个锁,系统就无法进入休眠,

可以被用户态程序和内核获得. 这个锁可以是有超时的或者是没有超时的,

超时的锁会在时间过去以后自动解锁. 如果没有锁了或者超时了, 内核就

会启动休眠的那套机制来进入休眠.

(一).内核维护了:

1).两个链表,active_wake_locks[WAKE_LOCK_TYPE_COUNT]

active_wake_locks[0]维护的是suspend lock.

active_wake_locks[1]维护的是idle lock.

2).一个链表,inactive_locks来记录所有处于inactive状态的锁.

(二). 下面讲述应用层申请的锁怎么传到kernel下面的,来理解

整个wakelock的框架。

比如/sys/power/wake_lock 下面的PowerManagerService

的生成过程。

1). Android 提供了现成 android.os.PowerManager 类 ,类中

提供 newWakeLock(int flags, String tag)方法来取得相应

层次的锁, 此函数的定义

frameworks/base/core/java/android/os/PowerManager.java

下面,应用程序在申请wake_lock时都会有调用。

实例:

PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE);

PowerManager.WakeLock wl = pm.newWakeLock

(PowerManager.SCREEN_DIM_WAKE_LOCK, “My Tag”);

wl.acquire();//申请锁这个里面会调用PowerManagerService里面acquireWakeLock()

***********************

wl.release(); //释放锁,显示的释放,如果申请的锁不在此释放系统就不会进入休眠。

2). frameworks层

/frameworks/base/services/java/com/android/server/

PowerManagerService.java

这个类是来管理所有的应用程序申请的wakelock。比如音视

频播放器,camera等申请的wakelock都是通过这个类来管理的。

static final String PARTIAL_NAME = "PowerManagerService"

Power.acquireWakeLock(Power.PARTIAL_WAKE_LOCK,

PARTIAL_NAME);

这个函数调用Power类里面的acquireWakeLock(),此时的

PARTIAL_NAME作为参数传递到底层去。

/frameworks/base/core/java/android/os/Power.java

public static native void acquireWakeLock(int lock, String id);

注:native申明的方法在Power类中没有实现,其实现体在

frameworks/base/core/jni/android_os_Power.cpp中,所

以调用Power类的acquireWakeLock()方法时会调用JNI

下的实现方法。

3).JNI层的实现

路径:frameworks/base/core/jni/android_os_Power.cpp

static void acquireWakeLock(JNIEnv *env, jobject clazz,

jint lock, jstring idObj)

{

**************

const char *id = env->GetStringUTFChars(idObj, NULL);

acquire_wake_lock(lock, id);

env->ReleaseStringUTFChars(idObj, id);

}

注:在acquireWakeLock()中调用了

路径下hardware/libhardware_legacy/power/power.c下面

的acquire_wake_lock(lock, id)

4).与kernel层的交互

在power.c下的acquire_wake_lock(lock, id)函数如下:

int acquire_wake_lock(int lock, const char* id)

{

**************

return write(fd, id, strlen(id));

}

注: fd就是文件描述符,在此表示”/sys/power/wake_lock”

id就是从PowerManagerService类中传下来的参数即:

PARTIAL_NAME = "PowerManagerService"

到此就是通过文件系统来与kernel层交互的地方。

转载于:https://my.oschina.net/u/1458728/blog/353813

android的wake_lock介绍相关推荐

  1. Android权限的介绍

    访问登记属性 android.permission.ACCESS_CHECKIN_PROPERTIES ,读取或写入登记check-in数据库属性表的权限 获取错略位置 android.permiss ...

  2. Android Fragment 基本介绍

    Android Fragment 基本介绍 Android Fragment 基本介绍 Fragment Android是在Android 3.0 (API level 11)开始引入Fragment ...

  3. Android Pmem相关介绍

    http://fangjian0518.blog.163.com/blog/#m=0 Android Pmem相关介绍 2011-10-18 09:40:26|  分类: Android PMEM | ...

  4. Kotlin on Android 开发环境介绍

    Kotlin 被 Google 采纳为 Android 开发一级编程语言,到现在也一年多了,我们团队从去年 10 月份开始部分项目尝试用 Kotlin 开发,到现在决定推广到全部项目,因为一旦用上 K ...

  5. android 屏幕保持唤醒 不锁屏 android.permission.WAKE_LOCK

     In AndroidManifest.xml 加上权限: <uses-permission android:name="android.permission.WAKE_LOCK& ...

  6. Android AIDL使用介绍(3) 浅说AIDL背后的Binder

    1.背景 在前面的博客中,我们已经学会了使用AIDL进行跨进程通信,AIDL的使用比较简单,可实际上跨进程通信是一个相当复杂的过程,例如进程A是怎么找到进程B的,如果有一个进程C冒充进程A,进程B又该 ...

  7. Android AIDL使用介绍(2)自定义数据类型的传递

    1.背景 默认情况下,AIDL只支持下列数据类型: Java八种基础数据类型(如 int.long.char.boolean 等); String字符串: CharSequence字符序列: List ...

  8. Android Canvas类介绍和Android Draw Rect 坐标图示

    当我们调整好画笔之后,现在需要绘制到画布上,这就得用Canvas类了.在Android中既然把Canvas当做画布,那么就可以在画布上绘制我们想要的任何东西.除了在画布上绘制之外,还需要设置一些关于画 ...

  9. linux wifi开发书籍,Android WIFI开发介绍.pdf

    Android WIFI开发介绍: WifiStateTracker 会创建WifiMonitor 接收来自底层的事件,WifiService 和WifiMonitor 是整个模块的核心.WifiSe ...

  10. Android中SlidingDrawer介绍【安卓进化三十四】

    Android中SlidingDrawer介绍[安卓进化三十四] 安卓中1.5后加入了SlidingDrawer[隐藏式抽屉],设计原理在你的UI布局有限的情况下,放不下太多的控件的时候,可以考虑用这 ...

最新文章

  1. 【Android 逆向】Android 逆向通用工具开发 ( adb forward 网络端口重定向命令 | PC 端逆向程序主函数分析 )
  2. Mapreduce基本工作流程
  3. CSS简介及常用标签及属性
  4. Bilibili资深运维工程师:DCDN在游戏应用加速中的实践
  5. python处理数据0和负数跳过_Python第十一章-常用的核心模块03-json模块
  6. C# 的一些便捷用法
  7. Python中文件操作和文件夹操作的学习笔记
  8. Testing a React+Redux web application
  9. 债市概览 | 一文梳理:债券发行、登记托管、交易与结算
  10. Java中判断素数的五种方法
  11. 右手定则判断向量积的方向
  12. c语言音乐播放器的代码大全,C语言音乐播放器实例代码
  13. HDU 5745 La Vie en rose(水~)
  14. 黑色星期五移动购物销售额iOS设备占逾80%
  15. 2021南京大学计算机考研分数线,2021年南京大学考研分数线公布
  16. [WEB]WEB工程
  17. 最接近win7的Linux系统,Windows7Vs.Linux——操作系统大PK
  18. 机器学习岗位的面试准备——总结1
  19. 等一等!看一看!缓一缓!
  20. Fishman的渔人码头 - Fishman - 新浪BLOG

热门文章

  1. Python_多进程
  2. 『计算机视觉』Mask-RCNN_锚框生成
  3. Number Sequence hdu1005
  4. Mysql忘记密码,支持中文,tab补全
  5. vue自学入门-2(vue创建项目)
  6. StringBuffer、StringBuilder、冒泡与选择排序、二分查找、基本数据类型包装类_DAY13...
  7. -bash: wget 未找到命令的解决办法
  8. 《机器学习》(周志华)笔记
  9. Spring系列:学习Spring的资源和讨论
  10. HTML-a标签添加下划线