當一個Android設備閑置時,首先它的屏幕將會變暗,然后關閉屏幕,最后關閉CPU。 這樣可以防止設備的電量被迅速消耗殆盡。但是,有時候也會存在一些特例:
Apps such as games or movie apps may need to keep the screen turned on. 例如:用戶在玩游戲時,需要保持屏幕常亮
Other applications may not need the screen to remain on, but they may require the CPU to keep running until a critical operation finishes. 又如:某些特定應用不需要屏幕保持常亮,但是CPU持續運行直到某些邏輯執行結束
下述主題討論,如何在必要的時候保持設備喚醒,同時又不會過多消耗電量。
主題一:保持設備喚醒狀態
To avoid draining the battery, an Android device that is left idle quickly falls asleep. However, there are times when an application needs to wake up the screen or the CPU and keep it awake to complete some work. 為了避免電量過度消耗,Android設備會在被閑置之后迅速進入睡眠狀態。然而有時候應用會需要喚醒屏幕或者是喚醒CPU並且保持它們的喚醒狀態,直至一些任務被完成。
需要依據具體的應用場景達到上述目的,但必須使用最輕量級的方式以免對系統資源造成影響。
如何保持屏幕常亮?
某些應用需要保持屏幕常亮,比如游戲與視頻應用。最好的方式是在你的Activity中(且僅在Activity中,而不是在Service或其他應用組件里)使用FLAG_KEEP_SCREEN_ON屬性。
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)不同,它不需要任何特殊的權限,系統會正確地管理應用之間的切換,且不必關系釋放資源的問題。
另一個方式是在布局文件中聲明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_SCRRE_ON等效。你可以選擇最適合你的應用的方法。在Activity中通過代碼設置常亮標識的優點在於:你可以通過代碼動態清除這個標示,從而使屏幕可以關閉。
需要注意的是:除非你不再希望正在運行的應用長時間點亮屏幕(例如:在一定時間無操作發生后,你想要將屏幕關閉),否則你是不需要清除FLAG_KEEP_SCRRE_ON 標識的。WindowManager會在應用進入后台或者返回前台時,正確管理屏幕的點亮或者關閉。但是如果你想要顯式地清除這一標識,從而使得屏幕能夠關閉,可以使用getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)方法。
主題二:調度重復的鬧鍾