標籤:stat protect require 重複 roi att win 問題 blog
當一個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)方法。
主題二:調度重複的鬧鐘
管理Android裝置的喚醒狀態