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修改屏幕休眠时间的方式,可以参考一下。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,474评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,019评论 4 62
  • 看到那个小仙女的照片,第一感觉好卡哇伊,好美腻哦,太适合画卡通漫画了。于是乎,绘画小白便画了这漫画美女,希望小仙女...
    尹伊儿阅读 565评论 5 21
  • 这次月考成绩早, 我儿又把喜来报。 全校排到十五名, 稳中有升也挺好。 稍微有点小遗憾, 分数还应再提高。 脸上一...
    石三英语阅读 91评论 0 0
  • 去做回自己吧 ,不要在意,你为他人的付出已经足够,需要去为自己好好考虑了。 去做回自己,敢爱敢恨,...
    稻草人LOVE阅读 212评论 0 1