Android系統在用戶長時間不操作時,為了節省資源,系統會選擇休眠。在休眠過程中自定義的Timer、Handler、Thread、Service等都會暫停。而有時候這種機制會影響到我們程序的正常運行。那如何避免系統休眠對我們程序的影響呢?
以下已Service服務為例說明在系統休眠的狀態下如何喚醒系統並執行我們自定義的Service服務。
一、單次Service服務的開啟
1、方法:在需要執行Service服務時獲取電源鎖,並在執行完畢釋放電源鎖。
2、代碼舉例:
public class WakeLockUtil
{
public static WakeLock wakeLock = null;
public static void acquireWakeLock(Activity myActivity)
{
if (null == wakeLock)
{
PowerManager pm = (PowerManager) myActivity.getSystemService(Context.POWER_SERVICE);
wakeLock = pm.newWakeLock(PowerManager.ON_AFTER_RELEASE | PowerManager.PARTIAL_WAKE_LOCK, "wakeLockUtil");
// PARTIAL_WAKE_LOCK:保持CPU 運轉,屏幕和鍵盤燈有可能是關閉的 -- 最常用,保持CPU運轉
// SCREEN_DIM_WAKE_LOCK:保持CPU 運轉,允許保持屏幕顯示但有可能是灰的,允許關閉鍵盤燈
// SCREEN_BRIGHT_WAKE_LOCK:保持CPU 運轉,允許保持屏幕高亮顯示,允許關閉鍵盤燈
// FULL_WAKE_LOCK:保持CPU 運轉,保持屏幕高亮顯示,鍵盤燈也保持亮度
// ACQUIRE_CAUSES_WAKEUP:強制使屏幕亮起,這種鎖主要針對一些必須通知用戶的操作.
// ON_AFTER_RELEASE:當鎖被釋放時,保持屏幕亮起一段時間
if (null != wakeLock)
{
wakeLock.acquire(); // 立即獲取電源鎖
// wakeLock.acquire(2000); // 2秒后獲取電源鎖
}
}
}
public static void releaseWakeLock(Activity myActivity)
{
if (null != wakeLock)
{
wakeLock.release();
wakeLock = null;
}
}
}
3、方法講解
acquireWakeLock():為獲取電源鎖,即喚醒系統。
releaseWakeLock():為釋放電源鎖(要在執行完畢后及時釋放電源鎖,否則會比較耗電)
二、定時重復的Service開啟
1、利用Android自帶的定時器AlarmManager實現
Intent intent = new Intent(mContext, ServiceTest.class);
PendingIntent pi = PendingIntent.getService(mContext, 1, intent, 0);
AlarmManager alarm = (AlarmManager) getSystemService(Service.ALARM_SERVICE);
if(alarm != null)
{
alarm.cancel(pi);
// 鬧鍾在系統睡眠狀態下會喚醒系統並執行提示功能
alarm.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 1000, 2000, pi);
//alarm.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), pi);
}
2、該定時器可以啟動Service服務、發送廣播、跳轉Activity,並且會在系統睡眠狀態下喚醒系統。所以該方法不用獲取電源鎖和釋放電源鎖。
