android 代码亮屏功能,Android开发实现保持屏幕常亮功能

释放双眼,带上耳机,听听看~!

网上有一种解决方案是使用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 掉了:

后来发现其实常亮功能很简单,只需要在在当前的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方法在热修复框架中应该是比较常用到的,非常的实用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值