Android实现保持屏幕常亮功能

Android实现保持屏幕常亮功能,第1张

概述笔者所在公司做的APP是股票类的,用户在查看股票报价页面的时候,往往需要开启盯盘模式,这个时候屏幕是不能黑屏的,黑屏会导致用户看不到一些关键报价涨跌,错过了买入卖出的最佳时机,就会给用户造成损失,这是股票

笔者所在公司做的APP是股票类的,用户在查看股票报价页面的时候,往往需要开启盯盘模式,这个时候屏幕是不能黑屏的,黑屏会导致用户看不到一些关键报价涨跌,错过了买入卖出的最佳时机,就会给用户造成损失,这是股票类软件所不能容许的,所以一般的股票类APP都会有屏幕常亮功能

当初我们做这个功能的时候,在网上找了一些教程发现有些达不到效果,然后找到了一种比较完美的没有兼容性的实现方案,下面给大家分享一下。

网上有一种解决方案是使用PowerManager来实现屏幕不锁屏:

  /**   * 打开休眠锁只能保持手机不休眠   * @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");    //是否需计算锁的数量    wakeLock.setReferenceCounted(false);    //请求常亮,onResume()    wakeLock.acquire();  }

但这种方式在实际的测试过程中并没有达到屏幕常亮的效果,而且还需要申明权限,不然会崩溃,所以这种方式被 pass 掉了:

<uses-permission androID:name="androID.permission.WAKE_LOCK" /> 

后来发现其实常亮功能很简单,只需要在在当前的Activity中获取到Window对象然后调用它的addFlags方法加上一个WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON 的标识。

Window window = activity.getwindow();    window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

然后关闭常亮功能的时候则只需要Window清除这个WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON标识即可

 window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

所以我们简单的封装了一下,只要是哪个页面Activity想要屏幕常亮则调用如下方法即可:

 /**   * 是否使屏幕常亮   *   * @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()方法中调用如下方法即可:

  @OverrIDe  protected voID onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentVIEw(R.layout.activity_main);    LonglightUtils.keepScreenLonglight(this);  }

因为屏幕常亮功能是可以在设置中设置开关的,而且下次用户进APP需要保存上一次的设置,所以我们把是否打开常亮功能保存在了SharedPreferences中。

如果整个APP的页面都要实现屏幕常亮该怎么做?难道在所有的Activity中的onCreate()都写调用这个方法吗?
答案显然不是,这样太没有效率。

一般情况我们的项目里都会有BaseActivity,BaseFragment之类的父类,来抽离出通用的方法和样式规范,所以我们可以在所有的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,这样才能实现交互。CordovaActivity是第三方的Activity显然是和我们的BaseActivity是没有关系的。

同时如果我们集成了一些第三方的SDK,打开他们的SDK里面的页面如果也需要屏幕常亮功能的话,该怎么办?因为我们也无法去修改他们的代码,不能在他们Activity中加入屏幕常亮功能。

这个时候其实有个很黑科技的功能,可能你以前都没有见到过,那就是在application中有一个方法,
registeractivitylifecycleCallbacks,可以传入一个回调接口,里面有当前APP中所有的Activity的生命周期方法回调,可以获取到所有的Activity实例,这样我们就能实现所有的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方法中调用屏幕常亮的方法即可实现,Application中registeractivitylifecycleCallbacks方法在热修复框架中应该是比较常用到的,非常的实用。

最后附上屏幕常亮的示例项目地址,有需要的朋友可以去看看。https://github.com/finddreams/ScreenLongLight

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。

总结

以上是内存溢出为你收集整理的Android实现保持屏幕常亮功能全部内容,希望文章能够帮你解决Android实现保持屏幕常亮功能所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1143862.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存