當前位置:首頁 » 安卓系統 » android休眠與喚醒

android休眠與喚醒

發布時間: 2022-12-15 00:27:54

『壹』 Android 休眠喚醒頻繁問題分析的一些工具

大家都知道目前的手機,平板等電子設備耗電都比較大,Android系統因為歷史和開源等原因,一直對耗電支持的不是很好。特別現在很多apk完全不care耗電,動不動給你裝上全家桶,還會相互間互相喚醒進程,簡直就是流氓軟體。從現有的應用來說,為了他們商業目的,有很多是類似要求長期後台運行的,或者定時運行的,這些服務對耗電影響都非常大。

雖然Android每次版本大更新,都對其進行了優化,加入了很多特性。比如在Android 5.0加入了JobScheler API機制(批處理);在Android 6.0加入App Standby(應用待機),Doze休眠機制;並且在Android7.0谷歌對Doze休眠機製做了進一步的優化,只要手動在後台刪掉應用卡片,關屏後該應用就會被很快深度休眠。

但是應用開發工程師由於各種原因沒有使用新的特性,導致用戶感覺設備耗電還是很大。所以國內很多手機廠家都有對android系統的耗電進行優化,從原理來說,目前這些廠家也是主要對兩方面進行優化:

1.減少定時休眠喚醒頻率,比如合並應用申請的定時喚醒鬧鍾來喚醒已經休眠的設備。

2.減少wake lock的頻率和時間。只要系統中存在任一有效的wake_lock,系統就不能進入深度休眠,但可以進行設備的淺度休眠操作。wake_lock一般在關閉lcd、tp但系統仍然需要正常運行的情況下使用,比如聽歌、傳輸很大的文件等。

可通過如下列印來確認喚醒源:

<4>[ 1321.989235] wakeup gpio0: 00000010

具體意思如下:

gpio0:表示是GPIO0

00000010:表示的是GPIO分組從高到低四個位元組分別是:DCBA,每個位元組的0-7bit就表示D7-D0  C7-C0  B7-B0  A7-A0.

從這里可以看出上面喚醒的GPIO是:GPIO0 PA4,對應的是RTC的中斷腳。

通過mpsys alarm命令列印可以看到哪個應用喚醒次數比較多,和總共佔用的時間:

這里的喚醒統計的是:應用申請 RTC_WAKEUP 或 ELAPSED_REALTIME_WAKEUP 的Alarm。不管系統是否在休眠,都會產生Alarm,所以這里的Alarm次數與第一章中說的kernel中統計的被RTC中斷喚醒的次數是匹配不上的,前都會大於後者。

看下Android系統定義的休眠喚醒不同的類型。

這個信息可以通過Project Volta里的工具historian.py將其圖形化顯示。

先導出bugreport

將其轉換成圖形化結果(目前好像只有網路瀏覽器才能打開這個html)

簡單說明如下:

1.橫軸是時間

2. wifi_scan指的是wifi處於掃描

3. wifi_running指的是wifi打開狀態

4. screen指的是屏亮的狀態

5. plugged指的是插入外設

6. wake_lock指的是kernel中被鎖住的狀態

可通過screen與wake_lock來初步確認系統是否被喚醒,如果screen是關的,然後又有wake_lock,也表明系統被喚醒並被鎖住一段時間。

把上層的喚醒和wifi喚醒都關了,測試了39個小時消耗30%電量

有以下幾個問題:

1.喚醒次數的確少了,但是healthd每10分鍾喚醒在圖上體現不出來

2.有2次喚醒後,系統被鎖住10多鍾才休眠下去

查看Alarm狀態,可以很明顯看到上層沒有再去wake up

但是驅動中還看到有被RTC喚醒,經過驗證是healthd喚醒的,不插充電的時候10分鍾,插充電的時候1分鍾間隔。這個喚醒後就更新battery的信息,上層Baterry更新下,UI刷新下。

系統被鎖住10幾分鍾,通過log分析在wifi斷開的時候,gms剛好去連接伺服器,通訊很久造成wake 比較久。從下面的信息可以判斷,系統目前wake lock線程最多的是gms線程。

Wake lock 在Android的電源管理系統中扮演一個核心的角色,wakelock是一種鎖的機制, 只要有task拿著這個鎖, 系統就無法進入休眠, 可以被用戶態進程和內核線程獲得。這個鎖可以是有超時的或者是沒有超時的, 超時的鎖會在時間過去以後自動解鎖。如果沒有鎖了或者超時了, 內核就會啟動標准linux的那套休眠機制機制來進入休眠。

提高電池續航,也就意味著減少系統和程序的電量消耗。為此 經過測試發現,每次喚醒設備,1-2秒的時候,都會消耗2分鍾(個別應用更久)的待機電量,可見每次喚醒設備的時候,不僅僅是點亮了屏幕,系統也在後台處理很多事情。

電池消耗比較大,從系統的行為上分析,有兩個地方影響最大

1.系統在被喚醒的期間,被一些應用wake lock比較久,造成很久時間無法再進入二級休眠。

2.系統頻繁的被喚醒,系統被喚醒目前包含三個喚醒源

(1).系統上層通過AlarmMananger的介面注冊rtc喚醒,

(2).wifi晶元自動喚醒,

(3).電池healthd定頻喚醒。

所以如果應用比較多的時候,應用在喚醒期間動作比較多,容易造成系統被wake lock,從而不會很快的進入二級休眠。

通過上述的分析來看,系統可以優化的地方有4個方面。

1).查看系統wake lock最多的線程,看能不能優化。

2).系統上層過濾的應用喚醒行為,從而降低喚醒頻率。AlarmManager包含四種類型定時策略,AlarmManager.ELAPSED_REALTIME、AlarmManager.ELAPSED_REALTIME_WAKEUP、AlarmManager.RTC、AlarmManager.RTC_WAKEUP、AlarmManager.POWER_OFF_WAKEUP。

其中應用申請RTC_WAKEUP或ELAPSED_REALTIME_WAKEUP的Alarm在系統休眠的情況下會喚醒系統。通過建立白名單或者黑名單的方式過濾此種應用的喚醒行為

3). 定時批處理一批操作,壓縮硬體喚醒時間,就像心跳一樣,讓硬體充分休息,還有就是精確監測應用請求,智能安排請求執行時間,讓資源利用最大化。

4).擴大healthd的定頻喚醒間隔(適度不然造成電池電量不準)

最後改一張調整過的電池狀態圖:

『貳』 如何查找喚醒android系統

如果在休眠中系統被中斷或者其他事件喚醒,接下來的代碼就會開始執行,這個喚醒的順序是和休眠的循序相反的,所以系統設備和匯流排會首先喚醒,使能系統中斷,使能休眠時候停止掉的非啟動CPU,以及調用suspend_ops->finish(),而且在suspend_devices_and_enter()函數中也會繼續喚醒每個設備,使能虛擬終端,最後調用suspend_ops->end().

在返回到enter_state()函數中的,當suspend_devices_and_enter()返回以後,外設已經喚醒了,但是進程和任務都還是凍結狀態,這里會調用suspend_finish()來解凍這些進程和任務,而且發出Notify來表示系統已經從suspend狀態退出,喚醒終端.

到這里,所有的休眠和喚醒就已經完畢了,系統繼續運行了.

Android系統Suspend和resume的函數流程
Android 休眠(suspend)介紹
在一個打過android補丁的內核中,state_store()函數會走另外一條路,會進入到request_suspend_state()中,這個文件在earlysuspend.c中.這些功能都是android系統加的,後面會對earlysuspend和lateresume進行介紹。

涉及到的文件:

linux_source/kernel/power/main.c

linux_source/kernel/power/earlysuspend.c

linux_source/kernel/power/wakelock.c

特性介紹

1)EarlySuspend

Early suspend是android引進的一種機制,這個機製作用在關閉顯示的時候,一些和顯示有關的設備,比如LCD背光,重力感應器,觸摸屏,這些設備都會關掉,但是系統可能還是在運行狀態(這時候還有wakelock)進行任務的處理,例如在掃描SD卡上的文件等.在嵌入式設備中,背光是一個很大的電源消耗,所以android會加入這樣一種機制。

2)LateResume

Late Resume是和suspend配套的一種機制,是在內核喚醒完畢開始執行的,主要就是喚醒在EarlySuspend的時候休眠的設備.

當所有的喚醒已經結束以後,用戶進程都已經開始運行了,喚醒通常會是以下的幾種原因:

來電

如果是來電,那麼Modem會通過發送命令給rild來讓rild通知WindowManager有來電響應,這樣就會遠程調用PowerManagerService來寫"on"到/sys/power/state來執行lateresume的設備,比如點亮屏幕等.

用戶按鍵用戶按鍵事件會送到WindowManager中,WindowManager會處理這些按鍵事件,按鍵分為幾種情況,如果案件不是喚醒鍵(能夠喚醒系統的按鍵)那麼WindowManager會主動放棄wakeLock來使系統進入再次休眠,如果按鍵是喚醒鍵,那麼WindowManger就會調用PowerManagerService中的介面來執行Late Resume.

Late Resume會依次喚醒前面調用了EarlySuspend的設備.

3)WakeLock

Wake Lock在Android的電源管理系統中扮演一個核心的角色.Wake Lock是一種鎖的機制,只要有人拿著這個鎖,系統就無法進入休眠,可以被用戶態程序和內核獲得。這個鎖可以是有超時的或者是沒有超時的,超時的鎖會在時間過去以後自動解鎖。如果沒有鎖了或者超時了,內核就會啟動休眠的那套機制來進入休眠。

3)AndroidSuspend

當用戶寫入mem或者standby到/sys/power/state中的時候,state_store()會被調用,然後Android會在這里調用request_suspend_state()而標準的Linux會在這里進入enter_state()這個函數.如果請求的是休眠,那麼early_suspend這個workqueue就會被調用,並且進入early_suspend狀態。調用request_suspend_state()後在suspend_work_queue工作線程上面注冊一個early_suspend_work工作者,

然後又通過staticDECLARE_WORK(early_suspend_work, early_suspend);注冊一個工作任務early_suspend。所以系統最終會調用early_suspend函數。

注冊加入suspend和resume流程
platform_device_register()-->platform_device_add()-->device_add()-->device_pm_add()-->,最終加入到了dpm_list的鏈表中,在其中的dpm_suspend和dpm_suspend中通過遍歷這個鏈表來進行查看哪個device中包含suspend和resume項。

系統喚醒和休眠

Kernel層[針對AndroidLinux2.6.28內核]:

其主要代碼在下列位置:

Drivers/base /main.c

kernel/power /main.c

kernel/power/wakelock.c

kernel/power/earlysuspend.c

其對Kernel提供的介面函數有

EXPORT_SYMBOL(wake_lock_init);//初始化Suspendlock,在使用前必須做初始化

EXPORT_SYMBOL(wake_lock);//申請lock,必須調用相應的unlock來釋放它

static DEFINE_TIMER(expire_timer,expire_wake_locks, 0, 0);//定時時間到,加入到suspend隊列中;

EXPORT_SYMBOL(wake_unlock);//釋放lock

EXPORT_SYMBOL_GPL(device_power_up);//打開特殊的設備

EXPORT_SYMBOL_GPL(device_power_down);//關閉特殊設備

EXPORT_SYMBOL_GPL(device_resume);//重新存儲設備的狀態;

EXPORT_SYMBOL_GPL(device_suspend);:保存系統狀態,並結束掉系統中的設備;

EXPORT_SYMBOL(register_early_suspend);//注冊earlysuspend的驅動

EXPORT_SYMBOL(unregister_early_suspend);//取消已經注冊的earlysuspend的驅動

Android的suspent執行流程
函數的流程如下所示:

應用程序通過對/sys/power/state的寫入操作可以使系統進行休眠的狀態,會調用/kernel/power/main.c中的state_store函數。pm_states包括:

PM_SUSPEND_ON,PM_SUSPEND_STANDBY,PM_SUSPEND_MEM滿足的狀態。

1)當狀態位PM_SUSPEND_ON的狀態的時候,request_suspend_state();當滿足休眠的狀態的時候,調用request_suspend_state在suspend_work_queue工作線程上創建early_suspend_work隊列,queue_work(suspend_work_queue,&early_suspend_work)。

2)然後通過DECLARE_WORK(early_suspend_work,early_suspend);在early_suspend_work工作隊列中添加工作任務調用early_suspend,所以early_suspend函數會被調用。

3)early_suspend函數中通過

list_for_each_entry(pos,&early_suspend_handlers, link) {

if (pos->suspend != NULL)

pos->suspend(pos);

在鏈表中找注冊的suspend函數,這個suspend是early的。early_suspend後面調用wake_unlock函數。語句:wake_unlock(&main_wake_lock);

4)wake_unlock()中調用mod_timer啟動expire_timer定時器,當定時時間到了,則執行expire_wake_locks函數,將suspend_work加入到suspend_work_queue隊列中,分析到這里就可以知道了early_suspend_work和suspend_work這兩個隊列的先後順序了(先執行early,定義一段時間後才執行suspend_work),然後會在suspend_work隊列中加入suspend的工作任務,所以wakelock.c中的suspend函數會被調用。

5)suspend調用了pm_suspend,通過判斷當前的狀態,選擇enter_state(),在enter_state中,經過了suspend_prepare,suspend_test和suspend_device_and_enter(),在suspend_device_and_enter中調用dpm_suspend_start(),然後調用dpm_suspend()。

6)dpm_suspend中利用while循環在dpm_list鏈表查找所有devic,然後調用device_suspend來保存狀態和結束系統的設備。到了這里,我們就又可以看見在初始化的時候所看到的隊列dpm_list。

dpm_list鏈表的添加是在device_pm_add中完成,請看上一節中。

Wake Lock
我們接下來看一看wakelock的機制是怎麼運行和起作用的,主要關注wakelock.c文件就可以了。

wake lock有加鎖和解鎖兩種狀態,加鎖的方式有兩種,一種是永久的鎖住,這樣的鎖除非顯示的放開,是不會解鎖的,所以這種鎖的使用是非常小心的.第二種是超時鎖,這種鎖會鎖定系統喚醒一段時間,如果這個時間過去了,這個鎖會自動解除.

鎖有兩種類型:

WAKE_LOCK_SUSPEND這種鎖會防止系統進入睡眠

WAKE_LOCK_IDLE這種鎖不會影響系統的休眠,作用我不是很清楚.

在wakelock中,會有3個地方讓系統直接開始suspend(),分別是:

1)在wake_unlock()中,如果發現解鎖以後沒有任何其他的wakelock了,就開始休眠

2)在定時器都到時間以後,定時器的回調函數會查看是否有其他的wakelock,如果沒有,就在這里讓系統進入睡眠.

3)在wake_lock()中,對一個wakelock加鎖以後,會再次檢查一下有沒有鎖,我想這里的檢查是沒有必要的,更好的方法是使加鎖的這個操作原子化,而 不是繁冗的檢查.而且這樣的檢查也有可能漏掉.

Android於標准Linux休眠的區別

pm_suspend()雖然會調用enter_state()來進入標準的Linux休眠流程,但是還是有一些區別:

當進入凍結進程的時候,android首先會檢查有沒有wakelock,如果沒有,才會停止這些進程,因為在開始suspend和凍結進程期間有可能有人申請了wake lock,如果是這樣,凍結進程會被中斷.

在suspend_late()中,會最後檢查一次有沒有wakelock,這有可能是某種快速申請wakelock,並且快速釋放這個鎖的進程導致的,如果有這種情況,這里會返回錯誤,整個suspend就會全部放棄.如果pm_suspend()成功了,LOG的輸出可以通過在kernelcmd裡面增加"no_console_suspend"來看到suspend和resume過程中的log輸出。

Android的電源管理主要是通過Wakelock來實現的,在最底層主要是通過如下隊列來實現其管理:

LIST_HEAD(dpm_list);

系統正常開機後進入到AWAKE狀態,,Backlight會從最亮慢慢調節到用戶設定的亮度,系統screenoff timer(settings->sound & display-> Display settings ->Screen timeout)開始計時,在計時時間到之前,如果有任何的activity事件發生,如Touchclick, keyboard pressed等事件,則將Resetscreen off timer, 系統保持在AWAKE狀態.如果有應用程序在這段時間內申請了Fullwake lock,那麼系統也將保持在AWAKE狀態,除非用戶按下powerkey.在AWAKE狀態下如果電池電量低或者是用AC供電screenoff timer時間到並且選中Keepscreen on while pluged in選項,backlight會被強制調節到DIM的狀態。

如果Screenoff timer時間到並且沒有Fullwake lock或者用戶按了powerkey,那麼系統狀態將被切換到NOTIFICATION,並且調用所有已經注冊的early_suspend_handlers函數,通常會把LCD和Backlight驅動注冊成earlysuspend類型,如有需要也可以把別的驅動注冊成earlysuspend,這樣就會在第一階段被關閉.接下來系統會判斷是否有partialwake lock acquired, 如果有則等待其釋放,在等待的過程中如果有useractivity事件發生,系統則馬上回到AWAKE狀態;如果沒有partialwake lock acquired, 則系統會馬上調用函數pm_suspend關閉其它相關的驅動,讓CPU進入休眠狀態。

系統在Sleep狀態時如果檢測到任何一個Wakeupsource,則CPU會從Sleep狀態被喚醒,並且調用相關的驅動的resume函數,接下來馬上調用前期注冊的earlysuspend驅動的resume函數,最後系統狀態回到AWAKE狀態.這里有個問題就是所有注冊過earlysuspend的函數在進Suspend的第一階段被調用可以理解,但是在resume的時候,Linux會先調用所有驅動的resume函數,而此時再調用前期注冊的earlysuspend驅動的resume函數有什麼意義呢?個人覺得android的這個earlysuspend和lateresume函數應該結合Linux下面的suspend和resume一起使用,而不是單獨的使用一個隊列來進行管理。

『叄』 android休眠喚醒後出現豎條紋

系統bug、屏幕故障。
1、系統bug。android休眠喚醒後出現豎條紋可能是系統出現了bug,可以試試更新系統或重置。
2、屏幕故障。android休眠喚醒後出現豎條紋可能是屏幕出現故障,可以去官方店鋪找工程師檢查。

『肆』 怎樣讓android系統休眠啊,關屏後還一直喚醒著,很耗電

讓android系統休眠,關屏後還一直喚醒著,很耗電的解決辦法如下:

  1. 系統運行的時候有很多軟體後台運行著,可以卸載一些不常用的軟體,來減低系統的負荷。

  2. 可以將系統屏幕關閉時間減少,來減少屏幕開啟時間過長,打開手機設置,點擊顯示,找到屏幕自動關閉選項,將時間設置到最低。

『伍』 Android-讓設備保持喚醒(激活)狀態

為了避免電池尿崩,Android會在沒有任務的時候快速進入睡眠狀態。然而有時候應用需要保持激活狀態。

你的需求決定了你選擇的方法。一般來說,盡可能選擇盡量輕量的方法滿足你的需求。下面幾個選項講述了如何選擇這些方法。

attribute:

簡而言之,通過設置 FLAG_KEEP_SCREEN_ON 標記來是屏幕保持常亮,這是一種比較輕量級的方法,系統會根據App是否在前台決定這個設置是否生效,如果是一般閱讀類App,電影App推薦使用這個。

To release the wake lock, call wakelock.release() . This releases your claim to the CPU. It's important to release a wake lock as soon as your app is finished using it to avoid draining the battery.

使用WAKE_LOCK保持CPU運算,但是一般不推薦使用,除非你有非要完成的任務。絕對不要在Activity中使用,一般在Service中使用即可。具體使用方法已經很清楚了,不譯了。

『陸』 Android APP休眠狀態下無法聯網和播放音頻解決方案

https://developer.android.google.cn/guide/topics/media/mediaplayer?hl=zh-cn

使用喚醒鎖定

當設計在後台播放媒體內容的應用時,設備可能會在您的 Service 運行時進入休眠狀態。由於 Android 系統嘗試在設備處於休眠狀態時節省電量,因此系統會嘗試關閉手機上任何不必要的功能,包括 CPU 和 WLAN 硬體。不過,如果您的 Service 正在播放或流式傳輸音樂,則您需要防止系統干擾播放。

為了確保您的 Service 在這些情況下能繼續運行,您必須使用「喚醒鎖定」。喚醒鎖定可以告訴系統:您的應用正在使用一些即使在手機處於閑置狀態時也應該可用的功能。

注意 :您應始終謹慎使用喚醒鎖定,並只使其保留必要的時長,因為它們會顯著縮短設備的電池續航時間。

為確保 CPU 在  MediaPlayer  播放時繼續運行,請在初始化 時調用  setWakeMode()  方法。完成該操作後, MediaPlayer  會在播放時保持指定的鎖定狀態,並在暫停或停止播放時釋放鎖定:

    mediaPlayer = new MediaPlayer();// ... other initialization here ...

mediaPlayer.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);

不過,此示例中獲取的喚醒鎖定只能保證 CPU 保持喚醒狀態。如果您使用 WLAN 並通過網路流式傳輸媒體內容,則您可能也希望保持  WifiLock ,該鎖定必須手動獲取和釋放。因此,當您開始使用遠程網址准備  MediaPlayer  時,您應創建並獲取 WLAN 鎖定。例如:

    WifiLock wifiLock = ((WifiManager) getSystemService(Context.WIFI_SERVICE)).createWifiLock(WifiManager.WIFI_MODE_FULL, "mylock");

wifiLock.acquire();

當您暫停或停止媒體內容,或者當您不再需要網路時,應釋放該鎖定:

    wifiLock.release();

『柒』 Android-WakeLock(喚醒鎖與CPU休眠/屏幕常亮)

參考:
https://blog.csdn.net/wh_19910525/article/details/8287202
http://landerlyoung.github.io/blog/2014/10/31/androidzhong-de-wakelockshi-yong/

: https://www.jianshu.com/p/2cfd179ef8dc
CSDN: https://blog.csdn.net/qq_32115439/article/details/80169222
GitHub博客: http://lioil.win/2018/05/02/Android-WakeLock.html
Coding博客: http://c.lioil.win/2018/05/02/Android-WakeLock.html

『捌』 java代碼怎麼控制android休眠和喚醒

喚醒:android.intent.action.SCREEN_ON (代碼)

休眠:android.intent.action.SCREEN_OFF (代碼)

android系統一段時間沒有操作,

屏幕(screen)將從高亮(bright)變為暗淡(dim),如果再過段時間還是沒有操作,屏幕(screen)從暗淡(dim)變為關閉(off).這時,系統將進入休眠.

而對於某些需要保持系統喚醒甚至屏幕喚醒的應用(比如視頻播放器和音樂播放器)來說,就必須要有一個機制,使得系統不進入休眠狀態,設置保持屏幕亮屏狀態.

wakelock即用來實現以上目的

接下來對每一個模塊具體分析:


powermanager

對應文件是android/frameworks/base/core/java/android/os/PowerManager.java


在Android中應用程序並不是直接同PowerManagerService交互的,而是通過PowerManager間接地與PowerManagerService打交道。

此文件定義了一個powermanager類.

主要實現了

1,wakelock的申請與釋放

public WakeLock newWakeLock(int flags, String tag)

2,系統延時進入休眠

public void userActivity(long when, boolean noChangeLights)

3,系統強制休眠

public void goToSleep(long time)

4,屏幕亮度設置

public void setBacklightBrightness(int brightness)

5,屏幕狀態查詢

public boolean isScreenOn()

6,系統重啟

public void reboot(String reason)


細節

wakelock的申請與釋放

{@samplecode

*PowerManager pm = (PowerManager)mContext.getSystemService(

* Context.POWER_SERVICE);

*PowerManager.WakeLock wl = pm.newWakeLock(

* PowerManager.SCREEN_DIM_WAKE_LOCK

* | PowerManager.ON_AFTER_RELEASE,

* TAG);

*wl.acquire();

* // ...

*wl.release();

一共有如下幾個flag來進行不一樣的喚醒方式.可以根據需要設置

Flag Value CPU Screen Keyboard

PARTIAL_WAKE_LOCK On* can-off Off

SCREEN_DIM_WAKE_LOCK On Dim Off

PROXIMITY_SCREEN_OFF_WAKE_LOCK on 距離感測器時關閉 off

SCREEN_BRIGHT_WAKE_LOCK On Bright Off

FULL_WAKE_LOCK On Bright Bright


ACQUIRE_CAUSES_WAKEUP 確保wakelock,主要用於視頻播放器

ON_AFTER_RELEASE = 0x20000000 release後倒計時,關閉屏幕

...


userActivity的作用:

使系統從其他狀態進入全部打開狀態,比如從暗屏(dim)切換到亮屏,並重置倒計時計數器

『玖』 android 如何讓手機進入休眠狀態,又如何喚

1.WakeLock主要代碼如下:

PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE);
wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, this.getClass().getName());//持有喚醒鎖
wakeLock.setReferenceCounted(false);
wakeLock.acquire(30*1000);//30s亮屏
wakeLock.release();//釋放鎖,滅屏

2.FLAG_KEEP_SCREEN_ON代碼如下
可使用 FLAG_KEEP_SCREEN_ON 替換WakeLock的方式.
this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);//亮屏
this.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);//滅屏

『拾』 android gsensor 休眠震動喚醒功能如何實現

一、喚醒源

設備休眠後,通過觸發喚醒源使設備恢復正常工作模式。設備喚醒源有多種,對於Android設備常見的就有PowerKey、來電喚醒、Alarm喚醒等。

喚醒源的實現處於內核空間,本文重點討論下PowerKey作為喚醒源的具體實現。

二、PowerKey喚醒源

PowerKey喚醒設備的原理,本質其實就是中斷。


PowerKey連接到CPU的一個輸入(Input)引腳(Pin)上,該Pin運行在中斷模式上。一旦PowerKey按下,引發Pin中斷;而該中斷具有喚醒CPU的功能,於是設備得以喚醒。

三、PowerKey對應的Pin
Configuration

和PowerKey相連的Pin的具體配置位於板級dts文件中,比如如下配置:

arch/arm/boot/dts/xxxxx.dts
power-key {
/** 是CPU的哪個Pin */
gpios = <&gpio0 GPIO_A5 GPIO_ACTIVE_LOW>;
/** Key code */
linux,code = <116>;
/** 起個名字 */
label = "power";
/** 該Pin具有wakeup的功能 */
gpio-key,wakeup;
};

著重說下linux,code =
<116>,116怎麼來的?

對於鍵盤,每一個按鍵都有唯一的編碼,在Linux中,編碼值位於:

input.h (kernelincludeuapilinux)
/*
* Keys and buttons
*/
#define KEY_RESERVED 0
#define KEY_ESC 1
#define KEY_BACKSPACE 14
#define KEY_TAB 15
#define KEY_POWER 116 /* SC System Power Down */


可知,PowerKey的編碼也在該文件中,且編碼值為116;一旦按下PowerKey,該值作為鍵值傳到input_event結構體的code成員變數中:

input.h (kernelincludeuapilinux)
/*
* The event structure itself
*/

struct input_event {
struct timeval time;
__u16 type;
__u16 code;
__s32 value;
};

之後我們會寫個Linux應用程序讀取code值。

熱點內容
音樂appftp安卓 發布:2025-03-20 19:03:24 瀏覽:304
家長申述驗證的密碼是什麼 發布:2025-03-20 18:55:27 瀏覽:7
編譯原理與技術第二版下載 發布:2025-03-20 18:55:26 瀏覽:937
怎麼寫編程語言 發布:2025-03-20 18:42:52 瀏覽:688
我去密碼是多少 發布:2025-03-20 18:12:28 瀏覽:541
方舟編譯器啥時候開始 發布:2025-03-20 18:11:40 瀏覽:959
常用java類 發布:2025-03-20 18:07:06 瀏覽:202
怎麼查看安卓大屏使用的什麼協議 發布:2025-03-20 18:03:07 瀏覽:704
好用的linux系統 發布:2025-03-20 17:51:15 瀏覽:648
n1網路存儲 發布:2025-03-20 17:51:11 瀏覽:636