Android实现保持屏幕常亮功能

笔者所在公司做的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

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

(0)

相关推荐

  • Android保持屏幕常亮2种实现方法

    方法一: 复制代码 代码如下: <uses-permission android:name="android.permission.WAKE_LOCK" /> 复制代码 代码如下: private PowerManager powerManager = null; private WakeLock wakeLock = null;   powerManager = (PowerManager) this.getSystemService(Service.POWER_SERV

  • Android保持屏幕常亮唤醒状态的方法

    本文实例讲述了Android保持屏幕常亮唤醒状态的方法.分享给大家供大家参考,具体如下: 第一步: 首先添加权限: 复制代码 代码如下: <uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission> 第二步:代码实现如下: public class ScreenActivity extends Activity { PowerManager powerManager

  • Android保持屏幕常亮

    Android保持屏幕常亮,PowerManager.WakeLock的使用 package com.hebaijun.wakelock; import android.app.Activity; import android.os.Bundle; import android.os.PowerManager; public class WakeLockActivity extends Activity { PowerManager.WakeLock wakeLock; /** Called w

  • Android编程调节屏幕亮度(背景灯)及保持背景灯常亮的方法

    本文实例讲述了Android编程调节屏幕亮度(背景灯)及保持背景灯常亮的方法.分享给大家供大家参考,具体如下: Android写的应用程序其实可以调节屏幕亮度的,查了一下资料发现WindowManager.LayoutParams这个类就包含了调节亮度的参数: WindowManager.LayoutParams lp = getWindow().getAttributes(); lp.screenBrightness = 0.1f; 其中参数screenBrightness就是设置屏幕亮度的0

  • Android实现保持屏幕常亮功能

    笔者所在公司做的APP是股票类的,用户在查看股票报价页面的时候,往往需要开启盯盘模式,这个时候屏幕是不能黑屏的,黑屏会导致用户看不到一些关键报价涨跌,错过了买入卖出的最佳时机,就会给用户造成损失,这是股票类软件所不能容许的,所以一般的股票类APP都会有屏幕常亮功能. 当初我们做这个功能的时候,在网上找了一些教程发现有些达不到效果,然后找到了一种比较完美的没有兼容性的实现方案,下面给大家分享一下. 网上有一种解决方案是使用PowerManager来实现屏幕不锁屏: /** * 打开休眠锁只能保持手

  • Android中关于屏幕的三个小众知识(宽屏适配、禁止截屏和保持屏幕常亮)

    前言 宽屏适配.禁止截屏和保持屏幕常亮,这三个与屏幕有关的 Android 开发小众知识,说不定什么时候就派上用场. 宽屏适配 Android的屏幕适配一直以来都在折磨着我们Android开发者,越来越多的手机厂商趋向于全面屏设计,比如今年出厂的 18.5:9 屏幕比例的三星 Galaxy S8 手机,前两天刚发布 18:9 屏幕比例的 OnePlus 5T 手机, 屏幕比例均超过过去常见的 16:9 比例.超大屏幕比例的设计对于 Android App 来说,存在一个屏幕适配的问题. 我们需要

  • Android实现屏幕保持常亮功能

    本文实例为大家分享了Android实现屏幕保持常亮的具体代码,供大家参考,具体内容如下 一.需求背景 当我们在玩游戏或者看视频的时候不希望app黑屏,那么就需要在app使用的时候处于常量状态. 二.实现方案 1.使用PowerManager.WakeLock PowerManager powerManager = (PowerManager)getSystemService(POWER_SERVICE); if (powerManager != null) {          wakeLock

  • Android中判断屏幕是否亮屏和是否解锁功能

    1.屏幕是否亮屏: PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE); //true为打开,false为关闭 boolean ifOpen = powerManager.isScreenOn(); 2.屏幕是否解锁: KeyguardManager mKeyguardManager = (KeyguardManager) context.getSystemServi

  • iOS实现控制屏幕常亮不变暗的方法示例

    前言 最近在做一个开发,有一个地方同步音乐文件,有时间会出现屏幕熄灭状态,导致同步出现断开,现在决定在同步时保持屏幕常亮,其实很多时候我们需要保持屏幕高亮,下面就来给大家介绍一个实现的方法,但是要记得在适当的时候关闭常亮 示例代码 //设置屏幕常亮 [UIApplication sharedApplication].idleTimerDisabled = YES; //取消设置屏幕常亮 [UIApplication sharedApplication].idleTimerDisabled = N

  • Android应用禁止屏幕休眠的3种方法

    做Android应用开发时,有时需要在应用前台运行时,禁止休眠,以下几种方法供参考. 方法一:持有WakeLock 添加休眠锁,休眠锁必须成对出现. private WakeLock mWakeLock = null; private void acquireWakeLock() { if(mWakeLock == null) { PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE); mWakeLock

随机推荐