完美实现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);
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的屏幕常亮功能的更多相关文章
- Android保持屏幕常亮
Android保持屏幕常亮,PowerManager.WakeLock的使用 package com.hebaijun.wakelock; import android.app.Activi ...
- Android保持屏幕常亮的方法
以前一直使用newWakeLock方法: this.powerManager = (PowerManager) this .getSystemService(Context.POWER_SERVICE ...
- Android保持屏幕常亮唤醒状态
第一步: 首先添加权限: <uses-permission android:name="android.permission.WAKE_LOCK"></uses ...
- Android 开发 屏幕常亮的3个方法
第一种 xml文件中的顶层布局添加属性: android:keepScreenOn="true" 第二种 在Window设置flag: getWindow().addFlags(W ...
- LongLightUtils【保持屏幕常亮工具类】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 这里只是简单记录下保持屏幕常亮工具类LongLightUtils的使用,具体请阅读参考资料<Android屏幕常亮,其实很简单 ...
- cocos2d-x 如何保持屏幕常亮
转自:http://blog.csdn.net/wolfking_2009/article/details/8939027 貌似cocos2d-x没有接口直接做这个功能 而各个平台又不一样,所以只能对 ...
- 性能优化-屏幕常亮与CPU唤醒
Android在不使用的时候,屏幕在一段时间以后会变暗,再过一段时间就会熄屏,此时CPU就会休眠,那么在这个时候,Timer.Handler.Thread.Service等都会暂停,有时候我们需要屏幕 ...
- win10 uwp 屏幕常亮
我们在播放视频需要屏幕常亮,我们可以使用DisplayRequest,因为代码简单我直接写,代码来自https://msdn.microsoft.com/en-us/library/windows/a ...
- Xamarin Essentials教程屏幕常亮ScreenLock
Xamarin Essentials教程屏幕常亮ScreenLock 在一段时间内,如果用户没有对设备进行操作,设备就会自动关闭屏幕.用户必须手动操作,才能点亮屏幕.但是很多应用需要在用户没有操作 ...
随机推荐
- (转)python-user-agents
原文:http://blog.topspeedsnail.com/archives/1958 Python3网络爬虫(四):使用User Agent和代理IP隐藏身份-------https://bl ...
- 全网最详细的Sublime Text 3的激活(图文详解)
不多说,直接上干货! 前期博客 全网最详细的Windows里下载与安装Sublime Text *(图文详解) ZYNGA INC. User License EA7E- 927BA117 84C93 ...
- Kafka中的zookeeper-shell.sh
连接 zookeeper bin/zookeeper-shell. 常用命令 connect host:port get path [watch] ls path [watch] set path d ...
- TCP/IP 笔记 - 概述
Effective communication depends on the use of a common language. 有效沟通取决于使用共同的语言 . TCP/IP协议族 一系列相关协议的 ...
- js便签笔记(10) - 分享:json.js源码解读笔记
1. 如何理解“json” 首先应该意识到,json是一种数据转换格式,既然是个“格式”,就是个抽象的东西.它不是js对象,也不是字符串,它只是一种格式,一种规定而已. 这个格式规定了如何将js对象转 ...
- Maven的默认中央仓库
当构建一个Maven项目时,首先检查pom.xml文件以确定依赖包的下载位置,执行顺序如下: 1.从本地资源库中查找并获得依赖包,如果没有,执行第2步. 2.从Maven默认中央仓库中查找并获得依赖包 ...
- 技术笔记2 jetty jboss
jetty热部署: jetty启动加载文件webdefault.xml .文件里: <init-param> <param-name>useFileMappedBuffer&l ...
- git命令小记
1.git之tag git标签分为轻量级(lightweight)标签和含标注(annotated)标签.轻量级标签一般用于不会改变的分支,含标注的标签包含详细的信息. 轻量级标签: git tag ...
- 使用area标签模仿a标签
众所周知,map标签可以给img图像标记热点区域,而area标签就是跟map标签一起使用的. 但area标签的作用可不止用来标记热点,因为它也有href属性,因此某些场景可以代替a标签进行页面跳转. ...
- 【angular5项目积累总结】avatar组件
View Code import { Component, HostListener, ElementRef } from '@angular/core'; import { Adal4Service ...