日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時間:2023/12/14 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 网易云音乐等三方app如何在锁屏显示 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

這里我本來準備反編譯一下網(wǎng)易云音樂,但是發(fā)現(xiàn)github上有一個仿照網(wǎng)易云音樂的開源項目,參考自 https://github.com/aa112901/remusic?,其他的應用在鎖屏上顯示的原理也都一樣,不過需要在手機中為應用開啟? 鎖屏顯示? 這一權限

首先我們要明白所有顯示在手機上界面都是由一層一層的Window構成(Activity是一個Window,鎖屏也是一個Window,具體大家可以去了解一下Window)。

ok,明白了這個原理我們不難想象,其實只要添加一個window并且保證他的z-order在鎖屏之上就能展示出來我們想要的效果。我們可以在手機開啟開發(fā)者權限并且打開usb調(diào)試之后在命令行輸入adb shell dumpsys window就可以看到window的層級顯示,此時發(fā)現(xiàn)網(wǎng)易云音樂的那個鎖屏顯示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@551a5afmOwnerUid=10162 mShowToOwnerOnly=true package=com.netease.cloudmusic appop=NONEmAttrs={(0,0)(fillxfill) sim={adjust=pan} layoutInDisplayCutoutMode=always blurRatio=1.0 blurMode=0 ty=BASE_APPLICATION fmt=TRANSPARENT wanim=0x10302f8 sysuil=truefl=LAYOUT_IN_SCREEN LAYOUT_INSET_DECOR SHOW_WHEN_LOCKED DISMISS_KEYGUARD SPLIT_TOUCH HARDWARE_ACCELERATED DRAWS_SYSTEM_BAR_BACKGROUNDSpfl=FORCE_DRAW_STATUS_BAR_BACKGROUNDvsysui=HIDE_NAVIGATION LAYOUT_STABLE LAYOUT_HIDE_NAVIGATION LAYOUT_FULLSCREEN IMMERSIVE_STICKY}Requested w=1080 h=2160 mLayoutSeq=3520mHasSurface=true isReadyForDisplay()=true mWindowRemovalAllowed=falseWindowStateAnimator{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=falseisOnScreen=trueisVisible=trueignoreInput=falsemMiuiNotFocusable=falsemMiuiNotTouchModal=false

以下分析過程皆以github上的仿網(wǎng)易云開源項目為例,一般實現(xiàn)參考https://blog.csdn.net/chenrenxiang/article/details/72528952 中的demo

1、Activity啟動的條件

我們要對滅屏狀態(tài)進行監(jiān)聽,當屏幕熄滅的時候去啟動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 值來說,這種方案可以顯著的節(jié)省內(nèi)存空間的占用,并且用戶設置起來也比較方便,可以使用或”|“同時設置多個類型。當然弊端也是有的,那就是單獨更改其中一個參數(shù)時時稍微麻煩一點,需要進行一些位運算。

this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD //用于去掉系統(tǒng)鎖屏頁| WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED //使Activity在鎖屏時能夠顯示); 在AndroidManifest文件中添加權限 <uses-permission android:name = "android.permission.DISABLE_KEYGUARD"/>

?在參考的開源項目中,顯示出的window就是LockActivity,對應的布局文件就是activity_lock,其中的自定義view還有調(diào)用的第三方庫這里就不在進行分析。所以歸根結底還是像我們平時寫一個頁面一樣,只不過需要在activity中設置一些對應window的flag讓他可以在鎖屏上顯示。

3、滑動后顯示鎖屏頁

我理解的是要把Activity直接finish掉就好了,但是看這個項目中的代碼好像是直接調(diào)用了postInvalidate()方法,不太理解,暫時先放下,也希望大家知道可以告訴我。

總結

以上是生活随笔為你收集整理的网易云音乐等三方app如何在锁屏显示的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。