Android6.0鎖屏源碼界面布局分析

分類:技術 時間:2017-01-13

大致先介紹一下鎖屏界面

Android的鎖屏界面可以分為兩級,

一級鎖屏界面暫且稱之為鎖屏界面LockScreen ,即平常用到的無需任何輸入和驗證,只需滑動解鎖,沒有任何的安全性可言,只是

為了防止因為非故意觸發手機造成的一定的困擾。

二級鎖屏界面是在解鎖一級界面后進入的一個界面 ,算是用于一定的加密,相當于給手機多了一層保護,所以二級界面通常稱之為安

全界面-----KeyguardSecurityView。要想解鎖該界面就需要輸入一定的驗證信息,圖案,密碼,pin碼等等各種加密方式。但也不要以

為有了這個界面你的手機就有很好的加密性了,這種很好消除和破解。

我看有些博客大神喜歡把第一級界面稱之為鎖屏界面LockScreen,第二級鎖屏界面稱之為解鎖界面UnLockScreen,不是太理解為什

么要這么說, 暫且留個問號吧 ???

轉載請注明出處 本文出自

海天之藍

Android6.0鎖屏源碼分析之界面布局分析

1,一級界面-----原生鎖屏

Android6.0的原生的鎖屏界面如上,上滑解鎖。

剛開始看到這個,確實不知道該如何去分析,不知道該界面到底隸屬于誰。這時候就要借助 sdk的工具 了。

當然,如果你對 framework層源碼很熟悉的話也可以從代碼角度來分析 ,該界面是在按下power電源鍵KEYCODE_POWER滅屏之后

加載出來的,而不是說每次在滅屏狀態下按鍵亮屏時再加載。根據這個邏輯,就要去看按鍵按下滅屏之后的處理,可以從

PhoneWindowManager看起,在該類中有對Power按鍵的處理。

如果從代碼角度這么追的話可能需要花費的時間或多一些, 建議還是直接使用sdk查看view視圖的工具,直接就可以定位到該鎖屏界


該工具可以顯示出來當前顯示的是哪一個界面,以及該界面的view視圖,可以幫助很好的分析鎖屏。借助該工具可以看到,鎖屏界面

對應的是StatusBar

可以看出,鎖屏界面屬于狀態欄,屬于SystemUi的一部分,類似于狀態欄下拉之后的界面,而Android4.4.2是屬于keyguard鎖屏界

面。

說的直白一點兒就是,6.0的鎖屏界面就是狀態欄下拉后的一個界面,準確來說是狀態欄加載出來的一個View(也可以說是組),解鎖

只需要上滑。Android4.4.2的鎖屏界面隸屬于keyguard,與statusBar沒有關系,就是一個界面。

借助sdk工具,可以分析鎖屏界面上你想分析的所有小部件

先看工具中顯示的view視圖的一小部分

介紹一下代碼所在位置,有需要改布局的或者鎖屏相關的可以參考

根據界面view的id/notification_panel可以找到鎖屏界面整體的xml文件為status_bar_expanded.xml文件,文件所在目錄為

\android\frameworks\base\packages\SystemUI\res\layout\status_bar_expanded.xml ,研究源碼要借助源碼搜索工具--openGrok可以

很快的找到所搜索的內容在整個源碼中使用的地方

用一張圖可以很清晰的看出各個部件的id

如果想要針對鎖屏的布局或者某個小控件做修改的話可以按照這張圖標注的id進行查找對應的view或者layout文件。

有了布局分析圖后你現在可以進行基本的布局相關的調整工作了,比如隱藏某個view,更改某個view的樣式,添加view,等等


舉個例子 ,我現在對底部的那三個按鈕感興趣,那么我就直接去找keyguard_bottom_area.xml文件(

文件目錄在\android\frameworks\base\packages\SystemUI\res\layout\status_bar_expanded.xml),各個按鈕的id我需要知道

要求一,滑動相機view時不進行任何操作

目前6.0源碼中是在滑動照相機這個view一段距離后,會自動調起來相機應用。我現在不讓他調起相機應用,而是開啟別的應用,怎

么做?


首先是分析既然是針對相機view的操作,那我們首先研究一下相機view滑動一段距離后怎么調起的相機應用。相應的可以直接把相機

應用替換成我們自己的應用,這樣每當view滑動一段距離后就會調起自己想要調起的應用。所以首先是找到調起相機應用的地方

@Override
   public void onClick(View v) {
        if (v == mCameraImageView) {
           launchCamera(CAMERA_LAUNCH_SOURCE_AFFORDANCE);
.....

在KeyguardBottomAreaView.java中有關于按鈕點擊后打開相機的操作,代碼目錄為

\android\frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\phone\KeyguardBottomAreaView.java

也就是說,你想讓點擊相機view之后做什么操作,只需要修改這里即可,至于相機應用如何起來的,可以根據代碼流程就行分析,在

這里不多介紹。

電話view與相機view屬于同一類型的view,同屬于com.android.systemui.statusbar.KeyguardAffordanceView。點擊事件也在該

onClick方法中。


要求二,目前是上滑解鎖,如何不讓其上滑解鎖

這個首先需要分析一下上滑這個動作在哪兒監聽的,然后何時會調用解鎖?按照這個思路分析了一下午,也沒理出個頭緒,幸而得到

一些指點,既然整個界面是個自定義的view,那么可以考慮對view屏蔽掉觸摸事件,即在view的onTouchEvent中規定,當滿足某種

條件時向上滑動不解鎖,這樣看來,省去了很多事。

可能有時候解決問題就是這樣,沒有必要去死鉆牛角尖非要數到小數點才肯罷休。但如果是想學習研究的話確實可以看一看。

要求三,定制某個按鍵,長按解鎖

Android6.0鎖屏有一個特點,那就是在一級鎖屏界面狀態下長按menu鍵可以解鎖。所以針對第三個要求,可以在鎖屏頁進行按鍵分

發時進行一個判斷,滿足條件后調用menu菜單解鎖的處理

做法如下

@Override
        public boolean dispatchKeyEvent(KeyEvent event) {
    	。。。。。
             //如果按鍵抬起,且為長按事件
              if (event.getAction() == KeyEvent.ACTION_UP amp;amp;(event.getFlags() amp; KeyEvent.FLAG_LONG_PRESS) == 0) {
                   int keyCode = event.getKeyCode();
                   if (keyCode == KeyEvent.KEYCODE_BACK amp;amp; event.getRepeatCount() == 0){
                //判斷按鍵,并進行解鎖操作,mLongPress線程里調用的是按下menu鍵解鎖的方法

               //mKeyguardView.handleMenuKey();

 mHandler.removeCallbacks(mLongPress); return true; }。。。 } return super.dispatchKeyEvent(event);

2,二級界面-----keyguardSecurity安全界面

這就是所謂的安全界面,需要輸入密碼,在解鎖了一級界面后如果設置了密碼就會進入到二級界面,仿照一級界面的分析方法來分析二級界面。
從現在開始,才開始是鎖屏相關的界面,鎖屏模塊代碼目錄如下

對于二級界面有6中情況

/**
*
*根據不同的模式獲取到不同的布局
 */
private int getLayoutIdFor(SecurityMode securityMode) {
        switch (securityMode) {
            case Pattern: return R.layout.keyguard_pattern_view;
            case PIN: return R.layout.keyguard_pin_view;
            case Password: return R.layout.keyguard_password_view;
            case SimPin: return R.layout.keyguard_sim_pin_view;
            case SimPuk: return R.layout.keyguard_sim_puk_view;
            default:
                return 0;
        }
    }

各種模式的定義在KeyguardSecurityMode.java中文件路徑為android/frameworks/base/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityMode.java

public enum SecurityMode {
        Invalid, // NULL state  所設置的狀態無效
        None, // No security enabled  沒有設置二級界面,即一級界面解鎖后直接進入主屏幕
        Pattern, // Unlock by drawing a pattern. 通過繪制圖案解鎖
        Password, // Unlock by entering an alphanumeric password 輸入密碼解鎖,該密碼包括字母和數字
        PIN, // Strictly numeric password 輸入純數字密碼解鎖
        SimPin, // Unlock by entering a sim pin. 輸入sim卡pin碼解鎖
        SimPuk // Unlock by entering a sim puk,輸入sim卡puk碼解鎖,該碼是唯一的,當sim卡密碼輸入pin碼錯誤次數
            //過多時會需要輸入puk碼,每個手機卡有自己的puk碼即ID由運營商提供
    }

不同的模式與布局文件一一對應,
對于布局上想要修改的,就去找對應的那幾個布局文件即可,在這里不再舉例說明。。
對于鎖屏界面的布局就分析到這里了,有什么寶貴意見的大神們可以甩出來,是一個學習的過程。
在完結了鎖屏界面布局分析之后,接下來的博客就要對鎖屏的加載即顯示鎖屏、解鎖一級界面,解鎖二級界面進行一個詳細分析了,

感覺工程量好大。慢慢來吧~~


Tags: 安卓開發

文章來源:http://m.blog.csdn.net/article/details?id=54377042


ads
ads

相關文章
ads

相關文章

ad