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,并且会在系统睡眠状态下唤醒系统。所以该方法不用获取电源锁和释放电源锁。