Android息屏弹Activity详解
- 更多分享:www.catbro.cn
一、前言:
- 在Android实际开发中遇到的需求多种多样,以此篇录之。
二、操作步骤
- 首先,在需要息屏弹出的Activity上我们需要添加如下代码:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
-
代码解析:
- FLAG_KEEP_SCREEN_ON :保持屏幕常亮
- FLAG_TURN_SCREEN_ON:启动Activity的时候点亮屏幕,FLAG_TURN_SCREEN_ON This constant was deprecated in API level 27. Use turnScreenOn or setTurnScreenOn(boolean) instead to prevent an unintentional double life-cycle event.
- FLAG_SHOW_WHEN_LOCKED:在锁屏情况下也可以显示屏幕
-
其次:在启动Activity的代码中需要通过PowerManager服务获取必要能力来进行启动,添加如下代码
Intent intent = new Intent(); intent.putExtra("orderBean", new Gson().toJson(orderBean)); intent.setClass(Okt.getInstance().getContext(), cla); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); KeyguardManager km = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE); final KeyguardManager.KeyguardLock kl = km.newKeyguardLock("unLock"); //解锁软盘 kl.disableKeyguard(); //获取电源管理器对象 PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); //获取PowerManager.WakeLock对象,后面的参数|表示同时传入两个值,最后的是LogCat里用的Tag final PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.SCREEN_DIM_WAKE_LOCK, "bright"); //点亮屏幕 wl.acquire(); context.startActivity(intent); //释放 wl.release(); kl.reenableKeyguard();
-
代码解析:
-
Wake Lock是一种锁的机制, 只要有人拿着这个锁,系统就无法进入休眠, 可以被用户态程序和内核获得. 这个锁可以是有超时的 或者 是没有超时的, 超时的锁会在时间过去以后自动解锁。如果没有锁了或者超时了, 内核就会启动休眠的那套机制来进入休眠.
-
PowerManager.WakeLock 有加锁和解锁两种状态,加锁的方式有两种: 第一种是永久的锁住,这样的锁除非显式的放开,否则是不会解锁的,所以这种锁用起来要非常的小心。 第二种锁是超时锁,这种锁会在锁住后一段时间解锁。
-
在创建了 PowerManager.WakeLock 后,有两种机制,第一种是不计数锁机制,另一种是计数锁机制。可以通过 setReferenceCounted(boolean value) 来指定,一般默认为计数机制。这两种机制的区别在于,前者无论 acquire() 了多少次,只要通过一次 release()即可解锁。而后者正真解锁是在( –count == 0 )的时候,同样当 (count == 0) 的时候才会去申请加锁。所以 PowerManager.WakeLock 的计数机制并不是正真意义上的对每次请求进行申请/释放每一把锁,它只是对同一把锁被申请/释放的次数进行了统计,然后再去操作。
-
我们上面代码仅使用默认的计数锁机制,一个acquire对应一个release
-
-
flags参数说明:
-
PARTIAL_WAKE_LOCK :保持CPU 运转,屏幕和键盘灯是关闭的。
-
SCREEN_DIM_WAKE_LOCK :保持CPU 运转,允许保持屏幕显示但有可能是灰的,关闭键盘灯
-
SCREEN_BRIGHT_WAKE_LOCK :保持CPU 运转,保持屏幕高亮显示,关闭键盘灯
-
FULL_WAKE_LOCK :保持CPU 运转,保持屏幕高亮显示,键盘灯也保持亮度
-
ACQUIRE_CAUSES_WAKEUP: 一旦有请求锁时,强制打开Screen和keyboard light
-
ON_AFTER_RELEASE: 在释放锁时reset activity timer
-