需求:實(shí)現(xiàn)動(dòng)態(tài)設(shè)置屏幕待機(jī)時(shí)間。
翻閱資料驶冒,網(wǎng)上有人使用直接獲取系統(tǒng)待機(jī)時(shí)間和設(shè)置系統(tǒng)待機(jī)時(shí)間來(lái)修改默認(rèn)的待機(jī)時(shí)間苟翻。
//獲取系統(tǒng)待機(jī)時(shí)間
float result = Settings.System.getInt(getContentResolver(), Settings.System.SCREEN_OFF_TIMEOUT);
//設(shè)置系統(tǒng)待機(jī)時(shí)間
Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_OFF_TIMEOUT, 10*60*1000);
//權(quán)限
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
一開(kāi)始直接參考這個(gè)方法,進(jìn)行一些封裝骗污,然后在真機(jī)上進(jìn)行測(cè)試崇猫,基本實(shí)現(xiàn)了需求。其中設(shè)置常亮給對(duì)應(yīng)的window設(shè)置下面的flag就可以了
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
本來(lái)以為簡(jiǎn)單的需求就實(shí)現(xiàn)了需忿。诅炉。蜡歹。。
??Too Young Too Simple
前一天下班的時(shí)候把公司的測(cè)試機(jī)升級(jí)了涕烧,然后第二天再打開(kāi)程序季稳,崩潰了。澈魄。。仲翎。
??崩潰1陨取?打開(kāi)調(diào)試溯香,缺少權(quán)限WRITE_SETTINGS
??清單文件中有鲫构,那是不是動(dòng)態(tài)授權(quán)?不要吐槽我學(xué)藝不精玫坛。结笨。。湿镀。之前真的沒(méi)注意到這個(gè)特殊權(quán)限炕吸。不能動(dòng)態(tài)授權(quán),清單文件授權(quán)無(wú)效勉痴,只能通過(guò)intent隱式跳轉(zhuǎn)設(shè)置獲群漳!!U裘瀑罗!產(chǎn)品萬(wàn)萬(wàn)不能同意啊。再說(shuō)別人家軟件也都沒(méi)有問(wèn)題啊雏掠。
??so斩祭,別人肯定不是這么修改的系統(tǒng)休眠時(shí)間,只能另尋道路了乡话。
終于還是找到別的方法了
[android PowerManager分析](http://www.mobile-open.com/2016/922582.html)
??通過(guò)這篇文章摧玫,然后自己去學(xué)習(xí)了powermanager的api,也實(shí)現(xiàn)了動(dòng)態(tài)修改屏幕待機(jī)時(shí)間的需求,并且不受權(quán)限限制蚊伞。
??通過(guò)系統(tǒng)的WakeLock去保持屏幕常亮席赂,在釋放的時(shí)候去影響屏幕。
PowerManager pm = (PowerManager) BaseApp.gContext.getSystemService(Context.POWER_SERVICE);
mWakeLock = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ON_AFTER_RELEASE, wl_tag);
mWakeLock.setReferenceCounted(false);
- setReferenceCounted()設(shè)置計(jì)數(shù)鎖和非計(jì)數(shù)鎖时迫;wakelock分為計(jì)數(shù)鎖和非計(jì)數(shù)鎖兩種:計(jì)數(shù)鎖是應(yīng)用調(diào)用一次acquire申請(qǐng)必定會(huì)對(duì)應(yīng)一個(gè)release來(lái)釋放颅停;非計(jì)數(shù)鎖應(yīng)用調(diào)用多次acquire,調(diào)用一次release就可釋放前面acquire的鎖掠拳。在申請(qǐng)wakelock時(shí)默認(rèn)申請(qǐng)的是計(jì)數(shù)鎖癞揉。
-
PowerManager.SCREEN_BRIGHT_WAKE_LOCK
- PowerManager.ON_AFTER_RELEASE
暫時(shí)使用了這兩個(gè)flag,第一個(gè)實(shí)現(xiàn)在lock釋放的時(shí)候關(guān)閉屏幕,第二個(gè)實(shí)現(xiàn)在lock釋放的時(shí)候留出短暫的緩沖期喊熟,為了防止lock時(shí)間切換到時(shí)候屏幕閃爍柏肪。
if (timeout != -1) {
getWakeLock().acquire(timeout);
} else {
getWakeLock().acquire();
}
PowerManagerService有加鎖和解鎖兩種狀態(tài),加鎖有兩種方式:
- 第一種是永久的鎖住芥牌,這樣的鎖除非顯式的放開(kāi)烦味,否則是不會(huì)解鎖的,所以這種鎖用起來(lái)要非常的小心(默認(rèn))壁拉。
- 第二種鎖是超時(shí)鎖谬俄,這種鎖會(huì)在鎖住后一段時(shí)間解鎖。
??對(duì)了弃理,還有權(quán)限:
<uses-permission android:name="android.permission.WAKE_LOCK" />
需要注意的是溃论,這個(gè)鎖的時(shí)間不會(huì)自動(dòng)刷新,所以使用了很low的方法痘昌,在activity層攔截事件中手動(dòng)刷新了這個(gè)時(shí)間钥勋。。辆苔。算灸。。暫時(shí)是這樣的姑子,后續(xù)研究出更好的方法會(huì)更新文章乎婿。。街佑。谢翎。
現(xiàn)在只是為了實(shí)現(xiàn)需求,后續(xù)會(huì)繼續(xù)研究PowerManager沐旨。
最后森逮,粘一下代碼
項(xiàng)目地址