• Android系统休眠对程序的影响以及处理


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

      

  • 相关阅读:
    Android Studio获取开发版SHA1值和发布版SHA1值的史上最详细方法
    Android Studio 汉化包
    Genymotion模拟器下载及安装步骤详解
    react native 搭建开发环境——Mac
    ::before和::after伪元素的用法
    前端面试题整理
    echarts图表自适应
    下拉加载更多
    vue之webpack+vuecli打包生成资源相对引用路径与背景图片的正确引用
    微信小程序之tab切换
  • 原文地址:https://www.cnblogs.com/bluejump/p/4529963.html
Copyright © 2020-2023  润新知