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层交互的地方。

android的wake_lock介绍的更多相关文章

  1. Android sdk目录介绍

    android sdk目录介绍 build-tools 各版本SDK编译工具 docs 离线开发者文档Android SDK API参考文档 extras 扩展开发包,如兼容架包. platforms ...

  2. Android异常:唤醒锁未授权。(Caused by: java.lang.SecurityException: Neither user 10044 nor current process has android.permission.WAKE_LOCK.)

    Android异常:Caused by: java.lang.SecurityException: Neither user 10044 nor current process has android ...

  3. 我的Android第三章:Android的组件介绍

    小编摘录了Android文档介绍Android四大组件的基本内容,感觉文档的内容写的很详细所以小编将它写入了博客 Android 使用Java语言开发.Android SDK 工具编译代码-以及任意数 ...

  4. GitHub上排名前100的Android开源库介绍(来自github)

    本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍,至于排名完全是根据 GitHub 搜索 Java 语言选择 (Best Match) 得到的结果,然后过滤了 ...

  5. android MVP模式介绍与实战

    android MVP模式介绍与实战 描述 MVP模式是什么?MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数 ...

  6. Android 不同文件名介绍

    Android 不同文件名介绍

  7. Android发展简单介绍

    Android一词的本义指“机器人”,同一时候也是Google于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统.中间件.用户界面和应用软件组成,号称是首个为移动 ...

  8. Android IntentService使用介绍以及源码解析

    版权声明:本文出自汪磊的博客,转载请务必注明出处. 一.IntentService概述及使用举例 IntentService内部实现机制用到了HandlerThread,如果对HandlerThrea ...

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

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

随机推荐

  1. 【ASP.NET 框架系列】您所经历的,但未必研究的那些技术

       本篇文章更适合具有一定开发经验,一定功底,且对底层代码有所研究的朋友!!! 本篇文章稍微偏原理且底层,有一定难度和且比较晦涩,文章粒度稍微粗些,更细粒度的,会在后续的文章中,结合具体的Demo实 ...

  2. 如何在Word中排出漂亮的代码

    引言 学数学和计算机,当然还是用LaTeX排版技术文章更方便.但有时候还是迫不得已需要用Word写作,另外Word其实也有Word的好处,比如细节上的修改要比LaTeX方便. 从Matlab高亮代码复 ...

  3. BZOJ4974 字符串大师(kmp)

    显然最短循环节长度=i-next[i],则相当于给定next数组构造字符串.然后按照kmp的过程模拟即可.虽然这看起来是一个染色问题,但是由图的特殊性,如果next=0只要贪心地选最小的就可以了,稍微 ...

  4. YOLO v1之总结篇(linux+windows)

    YOLO出自2016 CVPR You Only Look Once:Unified, Real-Time Object Detection,也是一个非常值得学习的框架,不得不说facebook的技术 ...

  5. VLC for Android 编译过程

    首先,给一个VLC的官网链接:VLC-AndroidCompile 上面有编译所需要安装的插件,环境变量的配置等等信息:虽然是英语,但也挺好理解,这里就不再详述:此文主要记录我在编译的过程中遇到的一些 ...

  6. 【MVVM Dev】多个具有依赖性质的ComboBox对数据的过滤

    一.前言 在界面编程中,我们常常会遇到具有依赖性质的ComboBox框,比如最常见的: 省/直辖市 => 地级市/区 => 区/街道 今天就说一下在WPF的MVVM模式中如何实现该功能 二 ...

  7. spark core (二)

    一.Spark-Shell交互式工具 1.Spark-Shell交互式工具 Spark-Shell提供了一种学习API的简单方式, 以及一个能够交互式分析数据的强大工具. 在Scala语言环境下或Py ...

  8. spring集成webSocket实现服务端向前端推送消息

    原文:https://blog.csdn.net/ya_nuo/article/details/79612158 spring集成webSocket实现服务端向前端推送消息   1.前端连接webso ...

  9. Spring MVC 向前台页面传值-ModelAndView

    ModelAndView 该对象中包含了一个model属性和一个view属性 model:其实是一个ModelMap类型.其实ModelMap是一个LinkedHashMap的子类 view:包含了一 ...

  10. Codeforces 894.C Marco and GCD Sequence

    C. Marco and GCD Sequence time limit per test 1 second memory limit per test 256 megabytes input sta ...