為了避免消耗電池電力,閒置的 Android 裝置會快速進入休眠狀態。不過,有時應用程式需要喚醒螢幕或 CPU,並保持喚醒狀態以完成某些工作。
實際採用的方法取決於應用程式的需求。不過,一般而言,原則上應盡可能使用最輕量的應用程式方法,以盡量減少應用程式對系統資源的影響。以下各節將說明如何處理裝置預設睡眠行為與應用程式需求不相容的情況。
使用 Wake Lock 的替代方案
在應用程式中新增 Wake Lock 支援前,請先考量應用程式的用途是否支援下列任一替代解決方案:
如果應用程式執行長時間的 HTTP 下載作業,請考慮使用
DownloadManager
。如果您的應用程式正在從外部伺服器同步處理資料,請考慮建立同步轉換介面。
如果應用程式依賴背景服務,請考慮使用 JobScheduler 或 Firebase 雲端通訊,按特定時間間隔觸發這些服務。
如果您需要在隨附裝置在隨附裝置上持續執行隨附應用程式,請使用隨附裝置管理工具。
讓螢幕保持開啟
部分應用程式 (例如遊戲或電影應用程式) 需要讓螢幕保持開啟狀態。最好的做法是在活動中使用 FLAG_KEEP_SCREEN_ON
(且只在活動中使用,不得在服務或其他應用程式元件中使用)。例如:
Kotlin
class MainActivity : Activity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) } }
Java
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); } }
這種做法的優點是 Wake Lock 與 Wake Lock 不同 (詳情請參閱「保持 CPU 開啟」一文的討論),不需要特殊權限,且平台會正確管理使用者在應用程式間移動,而無需擔心應用程式釋出未使用的資源。
另一種實作方式是在應用程式的版面配置 XML 檔案中,使用 android:keepScreenOn
屬性:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:keepScreenOn="true"> ... </RelativeLayout>
使用 android:keepScreenOn="true"
等同於使用 FLAG_KEEP_SCREEN_ON
。您可以採用最適合應用程式的方法。在活動中透過程式輔助方式設定標記的優勢,在於您可以選擇以程式輔助的方式清除標記,進而允許螢幕關閉。
電視的微光模式
在電視上,應使用 FLAG_KEEP_SCREEN_ON
,避免裝置在播放中影片時進入微光模式。如果前景活動未設定 FLAG_KEEP_SCREEN_ON
,裝置會在閒置一段時間後自動進入微光模式。
讓 CPU 保持開啟
如果您需要讓 CPU 保持運作,以便在裝置進入休眠狀態前完成某些工作,可以使用名為 Wake Lock 的 PowerManager
系統服務功能。Wake Lock 可讓您的應用程式控制主機裝置的電源狀態。
建立及保留 Wake Lock 可能會對主機裝置的電池壽命造成重大影響。因此,只有在嚴格必要時使用 Wake Lock,並盡可能縮短時間。舉例來說,您不應在活動中使用 Wake Lock。如上所述,如果想在活動中保持螢幕開啟,請使用 FLAG_KEEP_SCREEN_ON
。
使用 Wake Lock 的正當情況之一,可能是背景服務需要啟用 Wake Lock,才能讓 CPU 在螢幕關閉時執行工作。同樣地,此做法應盡可能降低對電池壽命的影響。
如要使用 Wake Lock,第一步是在應用程式的資訊清單檔案中新增 WAKE_LOCK
權限:
<uses-permission android:name="android.permission.WAKE_LOCK" />
如果應用程式包含使用服務執行工作的廣播接收器,請按照下列步驟直接設定 Wake Lock:
Kotlin
val wakeLock: PowerManager.WakeLock = (getSystemService(Context.POWER_SERVICE) as PowerManager).run { newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyApp::MyWakelockTag").apply { acquire() } }
Java
PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE); WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyApp::MyWakelockTag"); wakeLock.acquire();
如要解除 Wake Lock,請呼叫 wakelock.release()
。這會讓 CPU 撤銷要求。請務必在應用程式用完完畢後立即釋放 Wake Lock,以免耗電。