Android保持裝置喚醒

2021-09-05 09:36:28 字數 2857 閱讀 1306

contents

保持裝置喚醒... 1

使用wakelock之外的選擇... 1

保持螢幕亮... 1

保持cpu執行... 2

用broadcastreceiver保持裝置喚醒... 2

為了避免電量流失,android裝置進入閒置狀態後很快就會睡眠。然而,有時應用需要裝置保持螢幕或者cpu處於喚醒狀態一直到完成某項工作。

應用的需求不同採取的策略也不同。然而一般原則是盡量使用輕量級的方法,最小化應用對系統資源的使用。下面的段落描述了如何處理這種情況,即裝置預設的睡眠行為和你的應用的需求不相容。

在應用使用wakelock前,考慮是否你的需求滿足下面幾種不建議用wakelock的情況:

應用需要從外部伺服器同步資料,考慮用sync adapter。

如果應用依賴於後台服務,考慮用jobscheduler或者fcm定期觸發服務。

class

mainactivity

: activity

() }

這種策略的好處是,不像使用wakelock,他不需要特殊許可權,平台可以負責管理使用者在應用之間的切換,應用不用關心釋放資源的事情。

另乙個實現方式是在應用xml布局檔案中,用android:keepscreenon屬性:

xmlns:android

=""android:layout_width

="match_parent"

android:layout_height

="match_parent"android:keepscreenon="true">...

用android:keepscreenon=」true」等同於flag_keep_screen_on,對你的應用來說,哪個好用就用哪個。在activity中設定這個屬性的好處是,如果不需要了,你可以在後面的程式中選擇關掉它,這樣螢幕就不會長亮了。

注意:你不需要清除flag_keep_screen_on標誌,除非你不再需要螢幕保持長亮(例如,你希望在一定時間不活動之後螢幕時間超時)。當應用進入後台執行或者重新進入前台,window manager會負責螢幕的亮暗。但是如果你需要顯式清除這項標誌,以允許螢幕重新關掉,用clearflags():getwindow().clearflags(windowmanager.layoutparams.flag_keep_screen_on)。

如果你希望裝置睡去之前保持cpu執行以完成某項工作,可以用powermanager的系統服務功能wakelock。wakelock允許你控制主機的電源狀態。

建立和持有wakelock對主機的電池影響巨大。所以只有在非常必要的時候使用wakelock,並且持有時間盡可能短。例如,你永遠不需要在activity中使用wakelock。如上文所述,如果想在activty中亮,使用flag_keep_screen_on。

乙個合理的使用wakelock的情況是,後台服務需要獲取wakelock,在螢幕關的時候保持cpu執行。再次強調,盡可能減少使用wakelock的時間,因為太耗電了。

要使用wakelock,先在應用manifest檔案中加入許可權:

android:name

="android.permission.wake_lock"

/>

如果你的應用包含乙個broadcastreceiver,啟動乙個服務做一些操作,可以通過wakefulbroadcastreceiver管理你的wakelock。

powermanager

powermanager =(

powermanager

)getsystemservice

(power_service

);wakelock

wakelock

=powermanager

.newwakelock

(powermanager

.partial_wake_lock,);

wakelock.acquire();

要釋放wakelock,呼叫wakelock.release()。及時釋放wakelock很重要。

用broadcastreceiver和service管理後台任務的生命週期。

wakefulbroadcastreceiver是乙個特殊的broadcastreceiver,他負責為應用建立和管理partial_wake_lock。wakefulbroadcastreceiver把工作傳給service(一般是intentservice),同時保證裝置在傳輸過程中不進入睡眠模式。如果你在傳輸過程中不保持wakelock,有可能裝置進入睡眠模式,而你的任務還沒有完成。

使用wakefulbroadcastreceiver的第一步是把它新增到manifest中,就像其他broadcastreceiver一樣。

android:name

=".mywakefulreceiver"

>

下面的**用startwakefulservice()啟動了myintentservice。相比startservice(),這個方法在啟動的時候持有乙個wakelock。通過startwakefulservice()傳遞的intent中有個extra,指定wakelock型別。

public

class

mywakefulreceiver

extends

wakefulbroadcastreceiver

}

服務完成時呼叫mywakefulreceiver.completewakefulintent()釋放wakelock。completewakefulintent()的引數與從wakefulbroadcastreceiver()傳遞過來的一樣。

android分析手機喚醒源

我們可以先從kernel的log看喚醒源 exit comip suspend by modem 0x00000004 0x00000000 0x00000000 0x00000000 exit comip suspend by modem 0x00000004 0x00000000 0x00000...

Linux 下利用rtcwake喚醒裝置

以下是在opensuse上所做的測試 whereis rtcwake rtcwake usr sbin rtcwake usr share man man8 rtcwake.8.gz rtcwake help usage rtcwake options options d,device select...

android 保持程式啟動

引用 在做乙個程式的時候,需要時刻保持某一服務是啟動的,因此想到了通過監聽螢幕screen on和screen off這兩個action。奇怪的是,這兩個action只能通過 的形式註冊,才能被監聽到,使用androidmanifest.xml 完全監聽不到。查了一下,發現這是powermanage...