精华内容
下载资源
问答
  • android 休眠锁

    千次阅读 2017-09-25 10:11:52
    首先先简单介绍下Android休眠机制,它主要是基于系统的wake_lock机制,只要系统中存在任一有效的wake_lock,系统就无法进入休眠态。wake_lock一般在关闭屏幕时,仍然需要正常运行的情况下使用,比如关闭屏幕后的听...

           首先先简单介绍下Android的休眠机制,它主要是基于系统的wake_lock机制,只要系统中存在任一有效的wake_lock,系统就无法进入休眠态。wake_lock一般在关闭屏幕时,仍然需要正常运行的情况下使用,比如关闭屏幕后的听歌、传输很大的文件等功能时。同样的,当在系统关闭显示屏幕时,无任何功能业务在后台进行时,还持有wake_lock,那么此时系统耗电比较大,也是不正常的实现过程。所以wakelock在android的电源管理系统中扮演一个非常核心的角色,wakelock其实是一种系统锁的机制, 只要有程序拿着这个锁, android系统就无法进入休眠状态,wake_lock可以设置有超时的或者是没有超时的, 超时的锁会在超时时间过去后自动释放wake_lock。如果整个安卓系统没有wake_lock锁了或者超时释放了wake_lock锁, 那么系统内核就会启动标准linux的那套休眠机制机制来进入休眠。设置安卓系统的wake_lock有两种方法:

    1.PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE);
    WakeLock wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "tag");
    获取休眠锁:wakeLock.acquire(30*1000);//设置超时时间,30s后释放休眠锁,30秒亮屏时间;

    wakeLock.acquire()一直持有休眠锁
    判断是否持有休眠锁,并释放锁:if (wakeLock.isHeld()) {
                       wakeLock.release();}  


    2.可使用 FLAG_KEEP_SCREEN_ON 替换WakeLock的方式.
    this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);//亮屏
    this.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);//灭屏

    查看休眠锁的持有情况可以通过adb shell dumpsys power查看:

    获取锁的情况:


    释放锁的情况:


    从上图可以看出获取了锁时Wake Locks size为5;当释放了锁时Wake Locks为0。

    以上两种方法都可以获取到休眠锁,但是通过方法2获取的休眠锁,通过adb shell dumpsys power查看休眠锁时,并没有打印出该方法获取的锁的情况。所以写代码时,用方法二解屏显示或者常亮显示时,界面销毁时要记得调用this.getWindow().clearFlags函数。否则当业务结束后,还是很耗电,比较难定位有没有wake_lock被持有。比如上图中业务已经结束了,wake_lock已经为0了,但是系统还是很耗电要经过一段时间才会进入休眠,这个问题就是APP业务发起后this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);结束后没有释放造成的。


                   

    展开全文
  • 引起休眠动作(进入休眠前执行一些必要的操作)的事件有两个: ...最终都会调用到updatePowerStateLocked()方法,在更新一些标志的状态、发送休眠通知后,调用updateSuspendBlockerLocked()执行休眠锁的释放动作。

    Linux 3.10
    Android 4.4

    http://blog.csdn.net/u013686019/article/details/53691895

    一、PowerManagerService

    引起休眠动作(进入休眠前执行一些必要的操作)的事件有两个:

    • PowerKey事件,通过JNI调用PowerManagerService中的goToSleepFromNative()方法
    • Timeout,指【设置->显示->休眠】中设置的Timeout数值

    Android休眠在PowerManagerService中的流程如下图:



    图示:最终都会调用到updatePowerStateLocked()方法,在更新一些标志的状态、发送休眠通知后,调用updateSuspendBlockerLocked()执行休眠锁的释放动作


    二、PowerManagerService中Timeout处理流程

    /**
     * PowerManagerService设置了很多的标志位,用来标识某个事件的状态是否发生改变,比如:
     * DIRTY_SETTINGS,一旦系统设置发生变化,DIRTY_SETTINGS位就会被设置,
     * 处理函数检测到DIRTY_SETTINGS被置位,就进行相应的动作
     * dirty:包含了所有发生变化的标志
     */
    private void updateUserActivitySummaryLocked(long now, int dirty) {
    	// Update the status of the user activity timeout timer.
    	if ((dirty & (DIRTY_USER_ACTIVITY | DIRTY_WAKEFULNESS | DIRTY_SETTINGS)) != 0) {
    		// 1、消息队列中含有尚未处理的MSG_USER_ACTIVITY_TIMEOUT,就移除,避免重复进入休眠操作
    		mHandler.removeMessages(MSG_USER_ACTIVITY_TIMEOUT);
    
    		long nextTimeout = 0;
    		// 2、mWakefulness != WAKEFULNESS_ASLEEP:当前醒着
    		if (mWakefulness != WAKEFULNESS_ASLEEP) {
    			// 3、获取Timeout的值,比如30s
    			final int screenOffTimeout = getScreenOffTimeoutLocked();
    			// 屏幕在熄灭前,会先变暗一段时间,这段时间叫DimDuration,计算方式:
    			// SCREEN_DIM_DURATION = 7s,MAXIMUM_SCREEN_DIM_RATIO = 0.2
    			// Math.min(SCREEN_DIM_DURATION, (int)(screenOffTimeout * MAXIMUM_SCREEN_DIM_RATIO))
    			// 4、获取DimDuration的值,30s x 0.2 = 6s
    			final int screenDimDuration = getScreenDimDurationLocked(screenOffTimeout);
    
    			mUserActivitySummary = 0;
    			// 5、mLastUserActivityTime >= mLastWakeTime: 用户最后使用机器的时间在上次唤醒时间之后
    			if (mLastUserActivityTime >= mLastWakeTime) {
    				// nextTimeout:此处指到屏幕Dim的时间间隔
    				// 6、nextTimeout的时间:BASE + 30 - 6 = BASE + 24
    				nextTimeout = mLastUserActivityTime
    						+ screenOffTimeout - screenDimDuration;
    				if (now < nextTimeout) {
    					// now在屏幕Dim之前,说明屏幕亮着,设置flag
    					mUserActivitySummary |= USER_ACTIVITY_SCREEN_BRIGHT;
    				} else {
    					// extTimeout:此处指到屏幕熄灭的时间间隔
    					//7、nextTimeout的时间:BASE + 30 = BASE + 30
    					nextTimeout = mLastUserActivityTime + screenOffTimeout;
    					// 8、now处于屏幕Dim之后、屏幕熄灭之前设置DIM flag
    					if (now < nextTimeout) {
    						mUserActivitySummary |= USER_ACTIVITY_SCREEN_DIM;
    					}
    				}
    			}
    			if (mUserActivitySummary == 0
    					&& mLastUserActivityTimeNoChangeLights >= mLastWakeTime) {
    				nextTimeout = mLastUserActivityTimeNoChangeLights + screenOffTimeout;
    				if (now < nextTimeout
    						&& mDisplayPowerRequest.screenState
    								!= DisplayPowerRequest.SCREEN_STATE_OFF) {
    					mUserActivitySummary = mDisplayPowerRequest.screenState
    							== DisplayPowerRequest.SCREEN_STATE_BRIGHT ?
    							USER_ACTIVITY_SCREEN_BRIGHT : USER_ACTIVITY_SCREEN_DIM;
    				}
    			}
    			// mUserActivitySummary发生了改变
    			if (mUserActivitySummary != 0) {
    				Message msg = mHandler.obtainMessage(MSG_USER_ACTIVITY_TIMEOUT);
    				Slog.i(TAG, "updateUserActivitySummaryLocked, send MSG_USER_ACTIVITY_TIMEOUT");
    				msg.setAsynchronous(true);
    				mHandler.sendMessageAtTime(msg, nextTimeout);
    			}
    		} else {
    			mUserActivitySummary = 0;
    		}
    	}
    }


    MSG_USER_ACTIVITY_TIMEOUT事件处理:

    private final class PowerManagerHandler extends Handler {
    	@Override
    	public void handleMessage(Message msg) {
    		switch (msg.what) {
    		case MSG_USER_ACTIVITY_TIMEOUT:
    			handleUserActivityTimeout();
    			break;
    	}
    }
    
    /**
     * Called when a user activity timeout has occurred.
     * Simply indicates that something about user activity has changed so that the new
     * state can be recomputed when the power state is updated.
     */
    private void handleUserActivityTimeout() { // runs on handler thread
    	mDirty |= DIRTY_USER_ACTIVITY;
    	updatePowerStateLocked();
    }


    三、PowerManagerService中休眠锁的获取/释放

    这部分代码清晰,直接看下:

    private void updatePowerStateLocked() {
    	if (!mSystemReady || mDirty == 0) {
    		return;
    	}
    	// Phase 0: Basic state updates.
    
    	// Phase 1: Update wakefulness.
    	
    	// Phase 2: Update dreams and display power state.
    	
    	// Phase 3: Send notifications, if needed.
    	
    	// Phase 4: Update suspend blocker.
    	// Because we might release the last suspend blocker here, we need to make sure
    	// we finished everything else first!
    	updateSuspendBlockerLocked();
    }
    
    /**
     * Updates the suspend blocker that keeps the CPU alive.
     */
    private void updateSuspendBlockerLocked() {
    	final boolean needWakeLockSuspendBlocker = ((mWakeLockSummary & WAKE_LOCK_CPU) != 0);
    	final boolean needDisplaySuspendBlocker = needDisplaySuspendBlocker();
    
    	// First acquire suspend blockers if needed.
    	if (needWakeLockSuspendBlocker && !mHoldingWakeLockSuspendBlocker) {
    		mWakeLockSuspendBlocker.acquire();
    		mHoldingWakeLockSuspendBlocker = true;
    	}
    	if (needDisplaySuspendBlocker && !mHoldingDisplaySuspendBlocker) {
    		mDisplaySuspendBlocker.acquire();
    		mHoldingDisplaySuspendBlocker = true;
    	}
    
    	// Then release suspend blockers if needed.
    	if (!needWakeLockSuspendBlocker && mHoldingWakeLockSuspendBlocker) {
    		mWakeLockSuspendBlocker.release();
    		mHoldingWakeLockSuspendBlocker = false;
    	}
    	if (!needDisplaySuspendBlocker && mHoldingDisplaySuspendBlocker) {
    		mDisplaySuspendBlocker.release();
    		mHoldingDisplaySuspendBlocker = false;
    	}
    }
    
    private final class SuspendBlockerImpl implements SuspendBlocker {
    	private final String mName;
    	private int mReferenceCount;
    
    	public SuspendBlockerImpl(String name) {
    		mName = name;
    	}
    	
    	@Override
    	public void acquire() {
    		synchronized (this) {
    			mReferenceCount += 1;
    			if (mReferenceCount == 1) {
    				nativeAcquireSuspendBlocker(mName);
    			}
    		}
    	}
    
    	@Override
    	public void release() {
    		synchronized (this) {
    			mReferenceCount -= 1;
    			if (mReferenceCount == 0) {
    
    				nativeReleaseSuspendBlocker(mName);
    			}
    		}
    	}
    }

    休眠锁的获取和释放,最终通过JNI方式读写/sys/power/wake_lock、/sys/power/wake_unlock:

    // 1、JNI接口
    com_android_server_power_PowerManagerService.cpp (frameworks\base\services\jni)
    static void nativeAcquireSuspendBlocker(JNIEnv *env, jclass clazz, jstring nameStr) {
        ScopedUtfChars name(env, nameStr);
        acquire_wake_lock(PARTIAL_WAKE_LOCK, name.c_str());
    }
    
    // 2、定义要操作的文件
    power.c (hardware\libhardware_legacy\power)
    const char * const NEW_PATHS[] = {
        "/sys/power/wake_lock",
        "/sys/power/wake_unlock",
    };
    
    // 3、初始化设备节点
    static inline void initialize_fds(void)
    {
        if (g_initialized == 0) {
            if(open_file_descriptors(NEW_PATHS) < 0)
                open_file_descriptors(OLD_PATHS);
            g_initialized = 1;
        }
    }
    
    static int open_file_descriptors(const char * const paths[])
    {
        int i;
        for (i=0; i<OUR_FD_COUNT; i++) {
            int fd = open(paths[i], O_RDWR);
            if (fd < 0) {
                fprintf(stderr, "fatal error opening \"%s\"\n", paths[i]);
                g_error = errno;
                return -1;
            }
            g_fds[i] = fd;
        }
    
        g_error = 0;
        return 0;
    }
    
    // 4、id即为锁的名字,之后就是读写设备
    int acquire_wake_lock(int lock, const char* id)
    {
        initialize_fds();
    
        if (g_error) return g_error;
    
        int fd;
    
        if (lock == PARTIAL_WAKE_LOCK) {
            fd = g_fds[ACQUIRE_PARTIAL_WAKE_LOCK];
        }
        else {
            return EINVAL;
        }
    
        return write(fd, id, strlen(id));
    }
    

    展开全文
  • Android WakeLock休眠锁

    千次阅读 2018-04-05 14:29:24
    WakeLock(休眠锁)   WakeLock用于保持设备的唤醒状态,有些情况下,即时用户不操作App,我们也需要保持屏幕处于唤醒状态,以保证用户体验,比如视频类APP和计步类APP,视频类APP需要屏幕一直保持常量,计步类...

     

    WakeLock(休眠锁)

     

    WakeLock用于保持设备的唤醒状态,有些情况下,即时用户不操作App,我们也需要保持屏幕处于唤醒状态,以保证用户体验,比如视频类APP和计步类APP,视频类APP需要屏幕一直保持常量,计步类APP要求熄屏后程序依然保持运行状态。

     

    WakeLock的多种类型:

     

    • PARTIAL_WAKE_LOCK:保持CPU正常运转,但屏幕和键盘灯都可能是关闭的。
    • SCREEN_DIM_WAKE_LOCK:保持CPU正常运转,允许屏幕点亮但可能屏幕被置灰,键盘灯可能是关闭的。
    • SCREEN_BRIGHT_WAKE_LOCK:保持CPU正常运转,允许屏幕高亮显示,键盘灯可能是关闭的。
    • FULL_WAKE_LOCK:保持CPU正常运转,保持屏幕高亮显示,键盘灯也保持亮度。
    • ACQUIRE_CAUSES_WAKEUP:强制屏幕和键盘灯亮起,这种锁针对一些必须通知用户的操作。
    • ON_AFTER_RELEASE:当WakeLock被释放后,继续保持屏幕和键盘灯亮起一段时间。

     

    WakeLock使用注意事项

     

    使用WakeLock时一定要及时释放锁,因为如果未释放锁导致屏幕常亮会非常耗电,像视频类APP我们需要在暂停时就释放掉锁,而不是等到停止播放或销毁Activity时才释放锁。

     

    WakeLock使用方法:

      private PowerManager.WakeLock mWakeLock = null;
    
        /**
         * 获取唤醒锁
         */
        private void acquireWakeLock()
        {
            if(mWakeLock == null)
            {
                PowerManager mPM = (PowerManager) this.getSystemService(Context.POWER_SERVICE);
                mWakeLock = mPM.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK|
                        PowerManager.ON_AFTER_RELEASE,"PlayService");
                if(mWakeLock!=null)
                {
                    mWakeLock.acquire();
                }
            }
        }
    
        /**
         * 释放锁
         */
        private void releaseWakeLock()
        {
            if(mWakeLock!=null)
            {
                mWakeLock.release();
                mWakeLock = null;
            }
        }

     

     

    展开全文
  • android 休眠和唤醒

    2017-11-01 14:44:49
    利用PowerManager中 goToSleep和wakeUp方法实现手机强制休眠和唤醒,demo已测试通过
  • // private void acquireWakeLock(){ // if(mWakeLock==null){ // PowerManager pManager = ((PowerManager) getSystemService(Context.POWER_SERVICE)); // mWakeLock = pManager.newWakeLock(PowerManager.S...

    //    private void acquireWakeLock(){       
    //       if(mWakeLock==null){            
    //             PowerManager pManager = ((PowerManager) getSystemService(Context.POWER_SERVICE));           
    //            mWakeLock = pManager.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK  | PowerManager.ACQUIRE_CAUSES_WAKEUP , "MyPower");            
    //            mWakeLock.acquire();        
    //        }    
    //   }     
    //
    //   private void releaseWakeLock(){         
    //        if(null != mWakeLock && mWakeLock.isHeld()){             
    //             mWakeLock.release();            
    //             mWakeLock = null;        
    //        }     
    //   }

    -------------------------------------------

    public class AlarmAlertWakeLock {

        private static final String TAG = "AlarmAlertWakeLock";

        private static PowerManager.WakeLock sCpuWakeLock;

        public static PowerManager.WakeLock createPartialWakeLock(Context context) {
            PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
            return pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
        }

        public static void acquireCpuWakeLock(Context context) {
            if (sCpuWakeLock != null) {
                return;
            }

            sCpuWakeLock = createPartialWakeLock(context);
            sCpuWakeLock.acquire();
        }

        public static void acquireScreenCpuWakeLock(Context context) {
            if (sCpuWakeLock != null) {
                return;
            }
            PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
            sCpuWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK
                    | PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.ON_AFTER_RELEASE, TAG);
            sCpuWakeLock.acquire();
        }

        public static void releaseCpuLock() {
            if (sCpuWakeLock != null) {
                sCpuWakeLock.release();
                sCpuWakeLock = null;
            }
        }
    }

    展开全文
  • Android休眠】之Android休眠机制

    千次阅读 2018-08-15 19:08:16
    一、休眠概述 休眠,简而言之就是设备在不需要工作的时候把一些部件、外设关掉(掉电或让它进入低功耗模式)。 为什么要休眠呢?...二、Android休眠 休眠是内核的核心工作,而Android是基于Linux内核...
  • Android休眠】之Android休眠机制

    万次阅读 2016-12-14 21:42:13
    1、Android设备屏幕暗下来的时候,并不是立即就进入了休眠模式;当所有唤醒源都处于de-avtive状态后,系统才会进入休眠。 2、Android设备连着adb线到其他...如果系统中没有其他部件持有休眠锁,就尝试进入休眠模式,
  • Android 休眠流程的一点理解

    千次阅读 2018-12-13 11:14:23
    1.电源管理通过监测display的状态,当灭屏时则发起休眠的流程,调用native层的方法继续往下走。首先是在DisplayPowerController中收到MSG_UPDATE_POWER_STATE消息,随后经过一系列的回调了DisplayBlanker接口的...
  • 添加休眠锁休眠锁必须成对出现。 private WakeLock mWakeLock = null; private void acquireWakeLock() { if(mWakeLock == null) { PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE);...
  • 3.Linux休眠锁

    千次阅读 2018-01-02 17:38:29
    1.Android休眠机制Android休眠唤醒主要基于wake_lock机制,只要系统中存在任一有效的wake_lock,系统就不能进入深度休眠,但可以进行设备的浅度休眠操作。wake_lock一般在关闭lcd、tp但系统仍然需要正常运行的...
  • android休眠唤醒流程:

    千次阅读 2017-07-31 14:35:37
    android休眠唤醒流程: power按键事件上报给android系统,最终由windownmanager接收到,当有按键事件时判断是否需要休眠后唤醒系统,然后调用powermanager系统服务去写/sys/power/state节点.  此节点的写函数里...
  • android休眠唤醒机制-wakelock

    千次阅读 2016-03-08 10:30:22
    wakelock是一种的机制, 只要有task拿着这个, 系统就无法进入休眠, 可以被用户态进程和内核线程获得。...wakelock在android休眠唤醒机制中扮演着及其重要的角色,主要源码位于文件:kernel/kernel/power/w
  • Android 休眠机制

    2019-07-03 23:12:28
    1.Android休眠机制 Android休眠唤醒主要基于wake_lock机制,只要系统中存在任一有效的wake_lock,系统就不能进入深度休眠,但可以进行设备的浅度休眠操作。wake_lock一般在关闭lcd、tp但系统仍然需要正常运行的...
  • Android系统在用户长时间不操作时,为了节省资源,系统会选择休眠。在休眠过程中自定义的Timer、Handler、Thread、Service等都会暂停。而有时候这种机制会影响到我们程序的正常运行。 1、获取电源,并在执行完毕...
  • Android休眠唤醒1

    2017-09-08 09:49:21
    http://blog.csdn.net/zhaoxiaoqiang10_/article/details/24408129#t0 1、标准Linux睡眠唤醒机制简介: 休眠主要三个主要的步骤: (1)冻结用户态进程和内核态...(3)休眠核心设备和使CPU进入休眠
  • 本人也是安卓菜鸟一枚,入行不久,公司需要实现一个功能: 就是没有连接电源,黑屏(休眠)之后倒计时20分钟之后让机器关机。当时我就觉得也不是很难,我再Luancher中 可以注册动态广播监测到黑屏的操作,然后加入一个...
  • Android 实现系统深度休眠笔记

    万次阅读 2015-09-17 10:18:36
    休眠 DC连接汽车12V永不掉电,熄火时ACC发出掉电信号时,行车记录装置采用不关机,深度休眠策略。关闭屏幕,停止录像,记录轨迹的同时,需要打开飞行模式(蓝牙,WiFi),关闭FM发射,关闭GPS。如果此时有音乐播放和...
  • Android操作系统提供了唤醒机制用于避免系统进入休眠状态.但若存在唤醒的误用,将导致设备能耗的加剧并严重影响用户体验.本文分析总结了常见的唤醒误用类型及原因,并实现了一款安卓应用,用以检测当前系统中...
  • Android休眠】之AutoSleep

    千次阅读 2016-12-16 13:12:15
    当所有唤醒源状态都为“deactive”,系统自动进入休眠状态,实现该功能的即是“autosleep”。 由于“Android设备的特别需求”,Android提出了“Opportunistic Suspend”:Rather than trying to put the various ...
  • Android休眠唤醒流程分析

    千次阅读 2013-02-26 15:00:24
    Android休眠唤醒机制简介(一) 1、背景介绍:  睡眠/唤醒是嵌入式Linux非常重要的组成部分,因为优秀的睡眠唤醒机制可以是嵌入式设备尽可能的进入休眠状态,来延长电池的续航时间(这在移动终端消费类电子设备...
  • Android应用禁止屏幕休眠的几种方法

    万次阅读 2017-10-11 15:07:16
    Android应用开发时,有时需要在应用前台...添加休眠锁休眠锁必须成对出现。 private WakeLock mWakeLock; private void acquireWakeLock() { if(mWakeLock == null) { PowerManager pm = (PowerManager)g...
  • 对于一个完整的系统,我们在做PM(Power Manager)相关的事情时,应该(至少)其休眠涉及三个部分:用户(User Space)、CPU(Kernel)、外设。这篇短文对三者之间关系进行梳理总结。
  • 我们的Android应用程序很多需要和亮屏和熄屏打交道,比如闹钟的时候,需要保持亮屏,之后又需要熄屏。那么今天,我们来分析下这方面的功能。 二. 系统服务 --- PowerManager.java 顾名思义,PowerManager.java就是...
  • Android休眠调试总结

    千次阅读 2018-07-21 02:45:12
    进入休眠后,如果系统不持有,将会写mem到/sys/power/state(可参考https://blog.csdn.net/mike8825/article/details/80420213),如果没走到这一步,即打印信息中没有suspend entry的打印,说明系统持由,这时可将...
  • Android屏幕休眠和唤醒

    千次阅读 2018-10-15 15:44:33
    一、方式一 PowerManager pm = (PowerManager)getSystemService(Context....//持有唤醒 wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, this.getClass().getName()); wakeLock.setReferenceCounte...
  • private void setPowerWakeLock() { File file = new File("/sys/power/wake_lock"); if (file.exists()) { try { FileOutputStream fos = new FileOutputStream(file); PrintWriter pw = new PrintWriter(f...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,244
精华内容 3,297
关键字:

android休眠锁