android的wake_lock介绍

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

时间: 2024-10-25 07:29:12

android的wake_lock介绍的相关文章

Android多媒体开发介绍(转)

Android多媒体开发介绍 转自:http://blog.csdn.net/reiliu/article/details/9060557 一.       多媒体架构 基于第三方PacketVideo公司的OpenCORE来实现,支持所有通用的音频/视频/静态图像格式,包括:MPEG4.H.264.MP3.AAC.AMR.JPG.PNG.GIF等.从功能上分为两部分,一是音/视频的回放(PlayBack),二是音视频的纪录(Recorder). CODEC(编解码器)使用OpenMAX 1L

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

小编摘录了Android文档介绍Android四大组件的基本内容,感觉文档的内容写的很详细所以小编将它写入了博客 Android 使用Java语言开发.Android SDK 工具编译代码-以及任意数据并连同相关资源打包进一个Android 包内,它是一个以.apk 为后缀的压缩文件. 一个 .apk 文件中的 所有代码就是一个程序.这个.apk文件就用于在Android设备上安装这个程序. 一旦安装成功,这个Android程序就拥有了自己独立的运行沙盒(沙盒是在受限的安全环境中运行应用程序的一

Android控件介绍

Android控件介绍 多选按钮(CheckBox) CheckBox有两个常用的事件,OnClickListener事件和OnClickChangeListener事件 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_w

转android intent action 介绍大全

一些常用的Intent: Uri Action 功能 备注 geo:latitude,longitude Intent.ACTION_VIEW 打开地图应用程序并显示指定的经纬度   geo:0,0?q=street+address Intent.ACTION_VIEW 打开地图应用程序并显示指定的地址   http://web_address Intent.ACTION_VIEW 打开浏览器程序并显示指定的URL   https://web_address Intent.ACTION_VIEW

Android NDK 简单介绍、工具安装、环境配置

NDK全称:Native Development Kit. 1.NDK是一系列工具的集合. * NDK提供了一系列的工具,帮助开发人员高速开发C(或C++)的动态库,并能自己主动将so和java应用一起打包成apk.这些工具对开发人员的帮助是巨大的. * NDK集成了交叉编译器,并提供了对应的mk文件隔离平台.CPU.API等差异,开发者仅仅须要简单改动mk文件(指出"哪些文件须要编译"."编译特性要求"等),就能够创建出so. * NDK能够自己主动地将so和Ja

Android Fragment的介绍与使用(案例Demo)

应用场景: 众所了解Android上的界面展示都是通过Activity实现的,但是Activity也有它的局限性,同样的界面在手机上显示可能很好看,在平板上就未必了.为了让界面可以在平板上更好地展示,Android在3.0版本引入了Fragment(碎片)功能,它非常类似于Activity,可以像Activity一样包含布局.Fragment通常是嵌套在Activity中使用的.首先需要注意,Fragment是在3.0版本引入的,如果你使用的是3.0之前的系统,需要先导入android-supp

Android Fragment 基本介绍

Android Fragment 基本介绍 Fragment Android是在Android 3.0 (API level 11)开始引入Fragment的. 可以把Fragment想成Activity中的模块,这个模块有自己的布局,有自己的生命周期,单独处理自己的输入,在Activity运行的时候可以加载或者移除Fragment模块. 可以把Fragment设计成可以在多个Activity中复用的模块. 当开发的应用程序同时适用于平板电脑和手机时,可以利用Fragment实现灵活的布局,改善

Android通讯录数据库介绍与基本操作(增删改查)

Android通讯录数据库介绍与基本操作(增删改查) 2014年2月21日 Android通讯录管理总结 这几天导师安排我一个任务就是研究一下Android通讯录获取联系人.通话记录.短信的方法,还有看看不同Android版本之间的异同是否能做到兼容之类的事情.Android通讯录这一块,我个人感觉是挺乱的,网上一堆关于查询本地数据库获取联系人的方法,但似乎都没有仔细说明数据有哪些重要的表,它们之间有什么联系.下面是本人查询资料总结的一下知识点,方便童鞋们以后用到. http://xys2891

Android 电话系统框架介绍

在android系统中rild运行在AP上,AP上的应用通过rild发送AT指令给BP,BP接收到信息后又通过rild传送给AP.AP与BP之间有两种通信方式: 1.Solicited Response:Ap向Bp发送请求,Bp给Ap发送回复,该类型的AT指令及其回调函数以数组的形式存放在Ril_commands.h文件中: {数组中的索引号,请求回调函数,响应回调函数} [plain] view plaincopy {0, NULL, NULL},                   //no