美文网首页
Android屏幕亮度、待机时间总结

Android屏幕亮度、待机时间总结

作者: Erzyb | 来源:发表于2017-05-25 21:08 被阅读0次

    程序员成长笔记


    屏幕亮度部分

    //设置屏幕亮度
     private fun changeAppBrightness(context: Activity) {
            val window = context.window
            val lp = window.attributes
            if (isAutomatic) {//是否跟随系统
                lp.screenBrightness = WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE
            } else {
                lp.screenBrightness = (if (screenLightValue <= 0) 1 else screenLightValue) / 255f
            }
            window.attributes = lp
        }
    
        val screenLightValue: Int//获取屏幕亮度,例子中使用srp保存亮度值
            get() = SRPreferences.instance.getInt(SRPreferences.READ_LIGHT_VOLUE, 122)
    
        fun setScreenLightValue(activity: Activity, value: Int) {//设置亮度值,并改变屏幕亮度
            SRPreferences.instance.setInt(SRPreferences.READ_LIGHT_VOLUE, value)
            changeAppBrightness(activity)
        }
    
        private val screenLightMode: Int//获取屏幕亮度模式,跟随系统or手动控制
            get() = SRPreferences.instance.getInt(SRPreferences.READ_LIGHT_MODE, Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC)
    
        fun setScreenLightMode(activity: Activity, screenLightMode: Int) {//设置亮度模式,并改变屏幕亮度
            SRPreferences.instance.setInt(SRPreferences.READ_LIGHT_MODE, screenLightMode)
            changeAppBrightness(activity)
        }
    
        val isAutomatic: Boolean//是否跟随系统
            get() = screenLightMode == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC
    

    以上代码简单封装常用的屏幕亮度控制,提供简单的页面亮度模式切换和页面亮度改变。使用srp做部分的数据持久化,以便做为软件的持久设置,如不需要,可更改为静态变量。


    屏幕待机时间部分

    fun syster(reset: Boolean) {//记录系统待机时间或还原
            try {
                if (reset) {
                    Settings.System.putInt(App.app!!.contentResolver, Settings.System.SCREEN_OFF_TIMEOUT,
                            SRPreferences.instance.getInt(SRPreferences.READ_LIGHT_TIME_SYSTER, 10*60*1000))
                } else {
                    SRPreferences.instance.setInt(SRPreferences.READ_LIGHT_TIME_SYSTER,
                            Settings.System.getInt(App.app!!.contentResolver, Settings.System.SCREEN_OFF_TIMEOUT))
                }
            } catch (e: Exception) {
                e.printStackTrace()
            }
    
        }
    
        fun setWindowLightTime(activity: Activity, value: Int) {//设置屏幕待机时间
            SRPreferences.instance.setInt(SRPreferences.READ_LIGHT_TIME, value)
            activity.window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
            when (value) {
                0 -> syster(true)
                5 -> Settings.System.putInt(App.app!!.contentResolver, Settings.System.SCREEN_OFF_TIMEOUT, 15 * 1000)
                10 -> Settings.System.putInt(App.app!!.contentResolver, Settings.System.SCREEN_OFF_TIMEOUT, 30 * 1000)
                -1 -> activity.window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
            }
        }
    

    这部分主要有两个方法:

    1. 第一个方法主要是记录系统待机时间,以及还原系统待机时间。当参数为true时,是还原系统时间,前提是已经记录过系统时间,否则会设置为默认时间10分钟。
    2. 第二个方法主要是设置待机时间,可选项以及时间可以自己定制,现在的方法中主要有4个case,当值为0的时候即设置为系统时间,值为-1的时候会设置为常亮,值为5和10的时候回分别设置为不同的待机时间。
    3. 同样的使用srp做一些数据的持久化处理。
    4. 使用的时候一般会在进入程序时记录一下系统时间值,然后读取上次记录的用户选择值,并做设置;在退出程序的时候还原为系统时间值。

    最后记录一个自己用的倒计时的工具类:

    abstract class Timer {
        private var mMillisInFuture: Long = 0
        private val mCountdownInterval: Long = 1000
        private var mStopTimeInFuture: Long = 0
        private val mPauseTimeInFuture: Long = 0
        private var isStop = false
        private var isPause = false
    
        fun setMillisInFuture(millisInFuture: Long): TTSTimer {
            stop()
            mMillisInFuture = millisInFuture
            return this
        }
    
        @Synchronized private fun start(millisInFuture: Long): TTSTimer {
            isStop = false
            if (millisInFuture <= 0) {
                onFinish()
                return this
            }
            mStopTimeInFuture = SystemClock.elapsedRealtime() + millisInFuture
            mHandler.sendMessage(mHandler.obtainMessage(MSG))
            return this
        }
    
        /**
         * 开始倒计时
         */
        @Synchronized fun start() {
            start(mMillisInFuture)
        }
    
        /**
         * 停止倒计时
         */
        @Synchronized fun stop() {
            isStop = true
            mHandler.removeMessages(MSG)
        }
    
        /**
         * 重新开始
         */
        @Synchronized fun restart() {
            if (isStop || !isPause)
                return
            isPause = false
            start(mPauseTimeInFuture)
        }
    
        /**
         * 倒计时间隔回调
         * @param millisUntilFinished 剩余毫秒数
         */
        abstract fun onTick(millisUntilFinished: Long)
    
        /**
         * 倒计时结束回调
         */
        abstract fun onFinish()
    
        private val mHandler = object : Handler() {
            override fun handleMessage(msg: Message) {
                synchronized(this@Timer) {
                    if (isStop || isPause) {
                        return
                    }
                    val millisLeft = mStopTimeInFuture - SystemClock.elapsedRealtime()
                    if (millisLeft <= 0) {
                        onFinish()
                    } else {
                        val lastTickStart = SystemClock.elapsedRealtime()
                        onTick(millisLeft)
                        var delay = lastTickStart + mCountdownInterval - SystemClock.elapsedRealtime()
                        while (delay < 0)
                            delay += mCountdownInterval
                        sendMessageDelayed(obtainMessage(MSG), delay)
                    }
                }
            }
        }
        companion object {
            private val MSG = 1
        }
    }
    

    只是一个抽象类,具体使用:

    var mTimer: Timer = object : Timer() {
            override fun onTick(millisUntilFinished: Long) {
                //倒计时回调
            }
    
            override fun onFinish() {
                //结束回调
            }
        }
    
    mTimer.setMillisInFuture((30 * 60 * 1000).toLong()).start()
    

    代码地址


    更新:修改屏幕休眠时间的方法有bug,在高版本手机获取修改系统设置的权限并不太容易,所以在另一篇文章中介绍了使用powermanager修改屏幕休眠时间的方式,可以参考一下。

    相关文章

      网友评论

          本文标题:Android屏幕亮度、待机时间总结

          本文链接:https://www.haomeiwen.com/subject/kxuzxxtx.html