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

程序员成长笔记


屏幕亮度部分

//设置屏幕亮度
 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屏幕亮度、待机时间总结)