筆者所在公司做的APP是股票類的,用戶在查看股票報價頁面的時候,往往需要開啟盯盤模式,這個時候屏幕是不能黑屏的,黑屏會導(dǎo)致用戶看不到一些關(guān)鍵報價漲跌,錯過了買入賣出的最佳時機,就會給用戶造成損失,這是股票類軟件所不能容許的,所以一般的股票類APP都會有屏幕常亮功能。
成都創(chuàng)新互聯(lián)公司主要從事網(wǎng)站建設(shè)、做網(wǎng)站、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)浮山,十年網(wǎng)站建設(shè)經(jīng)驗,價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):028-86922220
當初我們做這個功能的時候,在網(wǎng)上找了一些教程發(fā)現(xiàn)有些達不到效果,然后找到了一種比較完美的沒有兼容性的實現(xiàn)方案,下面給大家分享一下。
網(wǎng)上有一種解決方案是使用PowerManager來實現(xiàn)屏幕不鎖屏:
/** * 打開休眠鎖只能保持手機不休眠 * @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"); //是否需計算鎖的數(shù)量 wakeLock.setReferenceCounted(false); //請求常亮,onResume() wakeLock.acquire(); }
但這種方式在實際的測試過程中并沒有達到屏幕常亮的效果,而且還需要申明權(quán)限,不然會崩潰,所以這種方式被 pass 掉了:
后來發(fā)現(xiàn)其實常亮功能很簡單,只需要在在當前的Activity中獲取到Window對象然后調(diào)用它的addFlags方法加上一個WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON 的標識。
Window window = activity.getWindow(); window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
然后關(guān)閉常亮功能的時候則只需要Window清除這個WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON標識即可
window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
所以我們簡單的封裝了一下,只要是哪個頁面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); }
因為屏幕常亮功能是可以在設(shè)置中設(shè)置開關(guān)的,而且下次用戶進APP需要保存上一次的設(shè)置,所以我們把是否打開常亮功能保存在了SharedPreferences中。
如果整個APP的頁面都要實現(xiàn)屏幕常亮該怎么做?難道在所有的Activity中的onCreate()都寫調(diào)用這個方法嗎?
答案顯然不是,這樣太沒有效率。
一般情況我們的項目里都會有BaseActivity,BaseFragment之類的父類,來抽離出通用的方法和樣式規(guī)范,所以我們可以在所有的Activity都會繼承的BaseActivity中onCreate()判斷是否需要屏幕常亮功能,這樣它的子類就具有了這個功能,像這樣:
public class BaseActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); LongLightUtils.keepScreenLongLight(this); } }
另外還有一種情況,我們的APP中不是所有的Activity都是會繼承BaseActivity,比如有些頁面我們需要用H5和原生交互,為了交互更加方便安全一般會選用Cordova,而負責交互打開H5頁面的Activity是需要繼承CordovaActivity,這樣才能實現(xiàn)交互。CordovaActivity是第三方的Activity顯然是和我們的BaseActivity是沒有關(guān)系的。
同時如果我們集成了一些第三方的SDK,打開他們的SDK里面的頁面如果也需要屏幕常亮功能的話,該怎么辦?因為我們也無法去修改他們的代碼,不能在他們Activity中加入屏幕常亮功能。
這個時候其實有個很黑科技的功能,可能你以前都沒有見到過,那就是在application中有一個方法,
registerActivityLifecycleCallbacks,可以傳入一個回調(diào)接口,里面有當前APP中所有的Activity的生命周期方法回調(diào),可以獲取到所有的Activity實例,這樣我們就能實現(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) { } }); } }
我們在ActivityLifecycleCallbacks的onActivityResumed方法中調(diào)用屏幕常亮的方法即可實現(xiàn),Application中registerActivityLifecycleCallbacks方法在熱修復(fù)框架中應(yīng)該是比較常用到的,非常的實用。
最后附上屏幕常亮的示例項目地址,有需要的朋友可以去看看。https://github.com/finddreams/ScreenLongLight
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。