目录

Android息屏弹Activity详解


一、前言:

  • 在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