完美实现Android的屏幕常亮功能

时间:2022-10-22 16:16:56

  笔者所在公司做的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);
if (isOpenLight) {
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
} else {
activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
} }

  在想要屏幕常亮的Activity的onCreate()方法中调用如下方法即可:

 @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
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/ganchuanpu/ScreenLongLight



														
		

完美实现Android的屏幕常亮功能的更多相关文章

  1. Android保持屏幕常亮

    Android保持屏幕常亮,PowerManager.WakeLock的使用 package com.hebaijun.wakelock;      import android.app.Activi ...

  2. Android保持屏幕常亮的方法

    以前一直使用newWakeLock方法: this.powerManager = (PowerManager) this .getSystemService(Context.POWER_SERVICE ...

  3. Android保持屏幕常亮唤醒状态

    第一步:  首先添加权限: <uses-permission android:name="android.permission.WAKE_LOCK"></uses ...

  4. Android 开发 屏幕常亮的3个方法

    第一种 xml文件中的顶层布局添加属性: android:keepScreenOn="true" 第二种 在Window设置flag: getWindow().addFlags(W ...

  5. LongLightUtils【保持屏幕常亮工具类】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 这里只是简单记录下保持屏幕常亮工具类LongLightUtils的使用,具体请阅读参考资料<Android屏幕常亮,其实很简单 ...

  6. cocos2d-x 如何保持屏幕常亮

    转自:http://blog.csdn.net/wolfking_2009/article/details/8939027 貌似cocos2d-x没有接口直接做这个功能 而各个平台又不一样,所以只能对 ...

  7. 性能优化-屏幕常亮与CPU唤醒

    Android在不使用的时候,屏幕在一段时间以后会变暗,再过一段时间就会熄屏,此时CPU就会休眠,那么在这个时候,Timer.Handler.Thread.Service等都会暂停,有时候我们需要屏幕 ...

  8. win10 uwp 屏幕常亮

    我们在播放视频需要屏幕常亮,我们可以使用DisplayRequest,因为代码简单我直接写,代码来自https://msdn.microsoft.com/en-us/library/windows/a ...

  9. Xamarin Essentials教程屏幕常亮ScreenLock

    Xamarin Essentials教程屏幕常亮ScreenLock   在一段时间内,如果用户没有对设备进行操作,设备就会自动关闭屏幕.用户必须手动操作,才能点亮屏幕.但是很多应用需要在用户没有操作 ...

随机推荐

  1. fMRI数据分析处理原理及方法

    来源: 整理文件的时候翻到的,来源已经找不到了囧感觉写得还是不错,贴在这里保存. 近年来,血氧水平依赖性磁共振脑功能成像(Blood oxygenation level-dependent funct ...

  2. 转--Eclipse中ctrl&plus;shift&plus;r与ctrl&plus;shift&plus;t的区别

    Eclipse中ctrl+shift+r与ctrl+shift+t的区别 标签: 快捷键工作区文件搜索打开资源文件 2016-09-13 15:44 292人阅读 评论(0) 收藏 举报  分类: e ...

  3. ACdream 1135&lpar;MST-最小生成树边上2个值,维护第一个最小的前提下让还有一个最小&rpar;

    F - MST Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) SubmitStatu ...

  4. Andorid Clip 实现自定义的进度条效果实例

    Android该系统提供了一个水平进度条为我们展现了运行使用进展情况,水平进度条显示用于运行进度Clip Drawable技术 下面我们通过一个具体的例子来说明Clip Drawable使用. 还有我 ...

  5. &period;net中读取xml文件中节点的所有属性信息

    功能描述: 将数据以xml的格式记录成配置文件,需要获取配置文件中的数据时,则获取对应的配置文件,读取配置文件里对应节点的所有属性. 逻辑实现: 1.将数据配置好在xml文件中. 2.获取xml文件中 ...

  6. socket的accept函数解析

    今天与同学争执一个话题:由于socket的accept函数在有客户端连接的时候产生了新的socket用于服务该客户端,那么,这个新的socket到底有没有占用一个新的端口? 讨论完后,才发现,自己虽然 ...

  7. Mysql多实例添加到开机自启的方法

    Mysql多实例配置成功后,想让配置成开机自启. 首先看一下Linux启动的知识点,顺序如下. 1 加载内核2 执行init程序3 /etc/rc.d/rc.sysinit   # 由init执行的第 ...

  8. 关于使用IsapiRewrite重写,重定向的语句

    早上起床,发现之前的IsapiRewrite写法有改进的地方, 有几个废弃的网址可以使用IsapiRewrite的重定向,转到新的网址上来. 搞了有十分钟的时间,测试老是不重定向. 因为之前已经有一个 ...

  9. 20145232 韩文浩 《Java程序设计》第9周学习总结

    教材学习内容总结 学习目标 了解JDBC架构 掌握JDBC架构 掌握反射与ClassLoader 了解自定义泛型和自定义枚举 会使用标准注解 JDBC标准主要分为两个部分:JDBC应用程序开发者接口和 ...

  10. win下php5&period;4安装ffmpeg-php扩展

    1.ffmpeg的官网没有提供ffmpeg-php dll的扩展下载. http://ffmpeg-php.sourceforge.net/ 虽然在http://sourceforge.net/上提供 ...