Android實(shí)現(xiàn)保持屏幕常亮功能
筆者所在公司做的APP是股票類的,用戶在查看股票報(bào)價(jià)頁面的時(shí)候,往往需要開啟盯盤模式,這個(gè)時(shí)候屏幕是不能黑屏的,黑屏?xí)?dǎo)致用戶看不到一些關(guān)鍵報(bào)價(jià)漲跌,錯(cuò)過了買入賣出的最佳時(shí)機(jī),就會(huì)給用戶造成損失,這是股票類軟件所不能容許的,所以一般的股票類APP都會(huì)有屏幕常亮功能。
當(dāng)初我們做這個(gè)功能的時(shí)候,在網(wǎng)上找了一些教程發(fā)現(xiàn)有些達(dá)不到效果,然后找到了一種比較完美的沒有兼容性的實(shí)現(xiàn)方案,下面給大家分享一下。
網(wǎng)上有一種解決方案是使用PowerManager來實(shí)現(xiàn)屏幕不鎖屏:
/**
* 打開休眠鎖只能保持手機(jī)不休眠
* @param context
*/
@Deprecated
public static void openWakeLock(Context context) {
PowerManager powerManager = (PowerManager) context.getSystemService(Service.POWER_SERVICE);
PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "My Lock");
//是否需計(jì)算鎖的數(shù)量
wakeLock.setReferenceCounted(false);
//請(qǐng)求常亮,onResume()
wakeLock.acquire();
}
但這種方式在實(shí)際的測(cè)試過程中并沒有達(dá)到屏幕常亮的效果,而且還需要申明權(quán)限,不然會(huì)崩潰,所以這種方式被 pass 掉了:
<uses-permission android:name="android.permission.WAKE_LOCK" />
后來發(fā)現(xiàn)其實(shí)常亮功能很簡(jiǎn)單,只需要在在當(dāng)前的Activity中獲取到Window對(duì)象然后調(diào)用它的addFlags方法加上一個(gè)WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON 的標(biāo)識(shí)。
Window window = activity.getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
然后關(guān)閉常亮功能的時(shí)候則只需要Window清除這個(gè)WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON標(biāo)識(shí)即可
window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
所以我們簡(jiǎn)單的封裝了一下,只要是哪個(gè)頁面Activity想要屏幕常亮則調(diào)用如下方法即可:
/**
* 是否使屏幕常亮
*
* @param activity
*/
public static void keepScreenLongLight(Activity activity) {
boolean isOpenLight = CommSharedUtil.getInstance(activity).getBoolean(CommSharedUtil.FLAG_IS_OPEN_LONG_LIGHT, true);
Window window = activity.getWindow();
if (isOpenLight) {
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
} else {
window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
}
在想要屏幕常亮的Activity的onCreate()方法中調(diào)用如下方法即可:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
LongLightUtils.keepScreenLongLight(this);
}
因?yàn)槠聊怀A凉δ苁强梢栽谠O(shè)置中設(shè)置開關(guān)的,而且下次用戶進(jìn)APP需要保存上一次的設(shè)置,所以我們把是否打開常亮功能保存在了SharedPreferences中。
如果整個(gè)APP的頁面都要實(shí)現(xiàn)屏幕常亮該怎么做?難道在所有的Activity中的onCreate()都寫調(diào)用這個(gè)方法嗎?
答案顯然不是,這樣太沒有效率。
一般情況我們的項(xiàng)目里都會(huì)有BaseActivity,BaseFragment之類的父類,來抽離出通用的方法和樣式規(guī)范,所以我們可以在所有的Activity都會(huì)繼承的BaseActivity中onCreate()判斷是否需要屏幕常亮功能,這樣它的子類就具有了這個(gè)功能,像這樣:
public class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LongLightUtils.keepScreenLongLight(this);
}
}
另外還有一種情況,我們的APP中不是所有的Activity都是會(huì)繼承BaseActivity,比如有些頁面我們需要用H5和原生交互,為了交互更加方便安全一般會(huì)選用Cordova,而負(fù)責(zé)交互打開H5頁面的Activity是需要繼承CordovaActivity,這樣才能實(shí)現(xiàn)交互。CordovaActivity是第三方的Activity顯然是和我們的BaseActivity是沒有關(guān)系的。
同時(shí)如果我們集成了一些第三方的SDK,打開他們的SDK里面的頁面如果也需要屏幕常亮功能的話,該怎么辦?因?yàn)槲覀円矡o法去修改他們的代碼,不能在他們Activity中加入屏幕常亮功能。
這個(gè)時(shí)候其實(shí)有個(gè)很黑科技的功能,可能你以前都沒有見到過,那就是在application中有一個(gè)方法,
registerActivityLifecycleCallbacks,可以傳入一個(gè)回調(diào)接口,里面有當(dāng)前APP中所有的Activity的生命周期方法回調(diào),可以獲取到所有的Activity實(shí)例,這樣我們就能實(shí)現(xiàn)所有的APP頁面都能屏幕常亮了:
public class MyApplication extends Application{
@Override
public void onCreate() {
super.onCreate();
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(Activity activity, Bundle bundle) {
}
@Override
public void onActivityStarted(Activity activity) {
}
@Override
public void onActivityResumed(Activity activity) {
LongLightUtils.keepScreenLongLight(activity);
}
@Override
public void onActivityPaused(Activity activity) {
}
@Override
public void onActivityStopped(Activity activity) {
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {
}
@Override
public void onActivityDestroyed(Activity activity) {
}
});
}
}
我們?cè)贏ctivityLifecycleCallbacks的onActivityResumed方法中調(diào)用屏幕常亮的方法即可實(shí)現(xiàn),Application中registerActivityLifecycleCallbacks方法在熱修復(fù)框架中應(yīng)該是比較常用到的,非常的實(shí)用。
最后附上屏幕常亮的示例項(xiàng)目地址,有需要的朋友可以去看看。https://github.com/finddreams/ScreenLongLight
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
詳解Android應(yīng)用開發(fā)中Intent的作用及使用方法
這篇文章主要介紹了Android應(yīng)用開發(fā)中Intent的作用與用法,包括如何激活A(yù)ctivity組件與Intent的投遞等,需要的朋友可以參考下2016-03-03
Android實(shí)現(xiàn)樹形層級(jí)ListView
這篇文章主要介紹了Android實(shí)現(xiàn)樹形層級(jí)ListView的相關(guān)資料,需要的朋友可以參考下2016-02-02
Android Jetpack組件庫LiveData源碼深入探究
LiveData是Jetpack組件的一部分,更多的時(shí)候是搭配ViewModel來使用,相對(duì)于Observable,LiveData的最大優(yōu)勢(shì)是其具有生命感知的,換句話說,LiveData可以保證只有在組件( Activity、Fragment、Service)處于活動(dòng)生命周期狀態(tài)的時(shí)候才會(huì)更新數(shù)據(jù)2022-09-09
Android通過aapt命令獲取apk詳細(xì)信息(包括:文件包名,版本號(hào),SDK等信息)
本文給大家分享android通過aapt命令獲取apk詳細(xì)信息(包括:文件包名,版本號(hào),SDK等信息),非常不錯(cuò),簡(jiǎn)單實(shí)用,對(duì)android sdk aapt知識(shí)感興趣的朋友一起通過本文學(xué)習(xí)吧2016-11-11
Android應(yīng)用的Material設(shè)計(jì)中圖片的相關(guān)處理指南
這篇文章主要介紹了Android應(yīng)用的Material設(shè)計(jì)中圖片的相關(guān)處理指南,除了介紹新的方法外文中還給出了一些設(shè)計(jì)標(biāo)準(zhǔn)樣例僅供參考,需要的朋友可以參考下2016-04-04
Jsoup 抓取頁面的數(shù)據(jù)實(shí)例詳解
這篇文章主要介紹了Jsoup 抓取頁面的數(shù)據(jù)實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2016-12-12

