网易云音乐等三方app如何在锁屏显示

这里我本来准备反编译一下网易云音乐,但是发现github上有一个仿照网易云音乐的开源项目,参考自 https://github.com/aa112901/remusic ,其他的应用在锁屏上显示的原理也都一样,不过需要在手机中为应用开启  锁屏显示  这一权限

首先我们要明白所有显示在手机上界面都是由一层一层的Window构成(Activity是一个Window,锁屏也是一个Window,具体大家可以去了解一下Window)。

ok,明白了这个原理我们不难想象,其实只要添加一个window并且保证他的z-order在锁屏之上就能展示出来我们想要的效果。我们可以在手机开启开发者权限并且打开usb调试之后在命令行输入adb shell dumpsys window就可以看到window的层级显示,此时发现网易云音乐的那个锁屏显示window是在锁屏之上的。

Window #9 Window{8990dbc u0 com.netease.cloudmusic/com.netease.cloudmusic.activity.LockScreenActivity}:
    mDisplayId=0 stackId=21 mSession=Session{e8728e8 16899:u0a10162} mClient=android.os.BinderProxy@551a5af
    mOwnerUid=10162 mShowToOwnerOnly=true package=com.netease.cloudmusic appop=NONE
    mAttrs={(0,0)(fillxfill) sim={adjust=pan} layoutInDisplayCutoutMode=always blurRatio=1.0 blurMode=0 ty=BASE_APPLICATION fmt=TRANSPARENT wanim=0x10302f8 sysuil=true
      fl=LAYOUT_IN_SCREEN LAYOUT_INSET_DECOR SHOW_WHEN_LOCKED DISMISS_KEYGUARD SPLIT_TOUCH HARDWARE_ACCELERATED DRAWS_SYSTEM_BAR_BACKGROUNDS
      pfl=FORCE_DRAW_STATUS_BAR_BACKGROUND
      vsysui=HIDE_NAVIGATION LAYOUT_STABLE LAYOUT_HIDE_NAVIGATION LAYOUT_FULLSCREEN IMMERSIVE_STICKY}
    Requested w=1080 h=2160 mLayoutSeq=3520
    mHasSurface=true isReadyForDisplay()=true mWindowRemovalAllowed=false
    WindowStateAnimator{db3a78f com.netease.cloudmusic/com.netease.cloudmusic.activity.LockScreenActivity}:
      Surface: shown=true layer=0 alpha=1.0 rect=(0.0,0.0) 1080 x 2160 transform=(1.0, 0.0, 1.0, 0.0)
      mHandleByGesture=false
    isOnScreen=true
    isVisible=true
    ignoreInput=false
    mMiuiNotFocusable=false
    mMiuiNotTouchModal=false

以下分析过程皆以github上的仿网易云开源项目为例,一般实现参考https://blog.csdn.net/chenrenxiang/article/details/72528952 中的demo

1、Activity启动的条件

我们要对灭屏状态进行监听,当屏幕熄灭的时候去启动Activity(锁屏的加载也是在灭屏的时候进行)

else if (Intent.ACTION_SCREEN_OFF.equals(action) ){
     if(isPlaying() && !mIsLocked){
        Intent lockscreen = new Intent(this, LockActivity.class);
        lockscreen.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(lockscreen);
      }
 }

2、在Activity中设置Window的flag

具体的各个windo的flag意思大家可以进去源码看,我也仅仅知道这样设置即可。

这里想记录一个知识点:最终的flags是由多个flag用”或(|)”连接起来的,也就是一个变量。

(参考别人的)举个栗子:0x0001 表示类型A, 0x0010 表示类型B,0x0100 表示类型C,0x1000 表示类型D,那么当类型ABD同时存在,但C不存在时时只用存储 0x1011 即可,相比于使用4个 boolean 值来说,这种方案可以显著的节省内存空间的占用,并且用户设置起来也比较方便,可以使用或”|“同时设置多个类型。当然弊端也是有的,那就是单独更改其中一个参数时时稍微麻烦一点,需要进行一些位运算。

this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD //用于去掉系统锁屏页
 | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED //使Activity在锁屏时能够显示);
在AndroidManifest文件中添加权限
<uses-permission android:name = "android.permission.DISABLE_KEYGUARD"/>

 在参考的开源项目中,显示出的window就是LockActivity,对应的布局文件就是activity_lock,其中的自定义view还有调用的第三方库这里就不在进行分析。所以归根结底还是像我们平时写一个页面一样,只不过需要在activity中设置一些对应window的flag让他可以在锁屏上显示。

3、滑动后显示锁屏页

我理解的是要把Activity直接finish掉就好了,但是看这个项目中的代码好像是直接调用了postInvalidate()方法,不太理解,暂时先放下,也希望大家知道可以告诉我。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值