程序員成長筆記
屏幕亮度部分
//設(shè)置屏幕亮度
private fun changeAppBrightness(context: Activity) {
val window = context.window
val lp = window.attributes
if (isAutomatic) {//是否跟隨系統(tǒng)
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) {//設(shè)置亮度值,并改變屏幕亮度
SRPreferences.instance.setInt(SRPreferences.READ_LIGHT_VOLUE, value)
changeAppBrightness(activity)
}
private val screenLightMode: Int//獲取屏幕亮度模式派歌,跟隨系統(tǒng)or手動控制
get() = SRPreferences.instance.getInt(SRPreferences.READ_LIGHT_MODE, Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC)
fun setScreenLightMode(activity: Activity, screenLightMode: Int) {//設(shè)置亮度模式弯囊,并改變屏幕亮度
SRPreferences.instance.setInt(SRPreferences.READ_LIGHT_MODE, screenLightMode)
changeAppBrightness(activity)
}
val isAutomatic: Boolean//是否跟隨系統(tǒng)
get() = screenLightMode == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC
以上代碼簡單封裝常用的屏幕亮度控制,提供簡單的頁面亮度模式切換和頁面亮度改變胶果。使用srp做部分的數(shù)據(jù)持久化,以便做為軟件的持久設(shè)置匾嘱,如不需要,可更改為靜態(tài)變量早抠。
屏幕待機時間部分
fun syster(reset: Boolean) {//記錄系統(tǒng)待機時間或還原
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) {//設(shè)置屏幕待機時間
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)
}
}
這部分主要有兩個方法:
- 第一個方法主要是記錄系統(tǒng)待機時間霎烙,以及還原系統(tǒng)待機時間。當(dāng)參數(shù)為true時,是還原系統(tǒng)時間蕊连,前提是已經(jīng)記錄過系統(tǒng)時間吼过,否則會設(shè)置為默認(rèn)時間10分鐘。
- 第二個方法主要是設(shè)置待機時間咪奖,可選項以及時間可以自己定制,現(xiàn)在的方法中主要有4個case,當(dāng)值為0的時候即設(shè)置為系統(tǒng)時間酱床,值為-1的時候會設(shè)置為常亮羊赵,值為5和10的時候回分別設(shè)置為不同的待機時間。
- 同樣的使用srp做一些數(shù)據(jù)的持久化處理扇谣。
- 使用的時候一般會在進(jìn)入程序時記錄一下系統(tǒng)時間值昧捷,然后讀取上次記錄的用戶選擇值,并做設(shè)置罐寨;在退出程序的時候還原為系統(tǒng)時間值靡挥。
最后記錄一個自己用的倒計時的工具類:
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)
}
/**
* 倒計時間隔回調(diào)
* @param millisUntilFinished 剩余毫秒數(shù)
*/
abstract fun onTick(millisUntilFinished: Long)
/**
* 倒計時結(jié)束回調(diào)
*/
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) {
//倒計時回調(diào)
}
override fun onFinish() {
//結(jié)束回調(diào)
}
}
mTimer.setMillisInFuture((30 * 60 * 1000).toLong()).start()
更新:修改屏幕休眠時間的方法有bug,在高版本手機獲取修改系統(tǒng)設(shè)置的權(quán)限并不太容易鸯绿,所以在另一篇文章中介紹了使用powermanager修改屏幕休眠時間的方式跋破,可以參考一下簸淀。