Android 解锁屏启动过程
生活随笔
收集整理的這篇文章主要介紹了
Android 解锁屏启动过程
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Android 解鎖屏啟動過程
一. 開機啟動
在開機過程中無線模塊初始化時獲取SIM卡,狀態。在初始化完成后調用vm.systemReady()函數通知進入相應的Lock Screen進行解鎖。
1. 在hardware/ril/reference-ril/reference-ril.c中:
通過 setRadioState (RADIO_STATE_SIM_NOT_READY) 來觸發對無線模塊的初始化。
通過 static void onRadioPowerOn() 對無線模塊初始化。
首先通過pollSIMState(Null):輪詢sim卡狀態。
由getSIMStatus()函數獲取sim卡狀態。
2. 當系統初始化完成后 會調用wm.systemReady()函數,觸發解鎖界面。
VM:WindowManagerService wm = null;
由于WM為空,調用WindowManagerService中函數:
public void systemReady () {
mPolicy.systemReady();
}
mPolicy: final WindowManagerPolicy mPolicy = PolicyManager.makeNewWindowManager();
(以下文件在frameworks/policies/base/phone/com/android/internal/policy/impl中)
3. PolicyManager.makeNewWindowManager(),調用文件 PolicyManagerer.java中函數:
public static WindowManagerPolicy makeNewWindowManager() {
return sPolicy.makeNewWindowManager();
}
4. sPolicy.makeNewWindowManager 調用的是文件 Policy.java中函數:
public PhoneWindowManager makeNewWindowManager() {
return new PhoneWindowManagerwv
}
5. PhoneWindowManager 繼承自 WindowManagerPolicy
mPolicy.systemReady() 最終調用的是文件 PhoneWindowManager.java 中的函數:
public void systemReady();
mKeyguardMediator.onSystemReady();
doKeyguard();
showLocked();
Message msg = mHandler.obtainMessage(Show);
mHandler.sendMessage(msg);
發送SHOW消息。
6. public void handleMessage(Message msg) 對 SHOW 消息進行了處理。
如果 msg.what 等于 SHOW 那么執行:
handleShow();
private void handleShow()
...
mCallback.onKeyguardShow();
mKeyguardViewManag.show()
7. mKeyguardViewManager.show() 調用的是文件 KeyguardViewManager.java 中的函數:
public synchronized void show()
...
mKeyguardView = mKeyguardViewProperties.createKeyguardView( mContext, mUpdateMonitor, this);
...
8. mKeyguardViewProperties.createKeyguardView
調用的是文件 LockPatternKeyguardViewProperties.java中的函數:
public KeyguardViewBase createKeyguardView(Context context,
KeyguardUpdateMonitor updateMonitor,
KeyguardWindowController controller) {
return new LockPatternKeyguardView(context, updateMonitor,
mLockPatternUtils, controller);
}
9.? new LockPatternKeyguardView 調用了類 LockPatternKeyguardView 的構造函數:
public LockPatternKeyguardView(
Context context,
KeyguardUpdateMonitor updateMonitor,
LockPatternUtils lockPatternUtils,
KeyguardWindowController controller)
...
mLockScreen = createLockScreen();
addView(mLockScreen);
final UnlockMode unlockMode = getUnlockMode();
mUnlockScreen = createUnlockScreenFor(unlockMode);
mUnlockScreenMode =unlockMode;
addView(mUnlockScreen);
updateScreen(mMode);
其中getUnlockMode 獲得鎖類型,通常有三種:
enum UnlockMode {
Pattern,
SinPIN,
Account
}
createUnlockScreenFor(unlockMode)根據相應的unlockMode而調用對應的解鎖屏。
二. 按紅鍵啟動
點擊結束通話鍵(紅鍵),根據action:
TelephonyManager.ACTION_PHONE_STATE_CHANGE和TelephonyManager.EXTRA_STATE_IDLE
調用frameworks/policies/base/phone/com/android/internal/policy/impl/
KeyguardViewMediator.java中函數:
doKeyguard();
private void showLocked() {
??????? if (DEBUG) Log.d(TAG, "showLocked");
??????? // ensure we stay awake until we are finished displaying the keyguard
??????? mShowKeyguardWakeLock.acquire();
??????? Message msg = mHandler.obtainMessage(SHOW);
??????? mHandler.sendMessage(msg);
}
發送SHOW消息。
之后轉到“開機啟動”的第六步。
三. 其它方式
1. SIM卡狀態改變,當sim卡狀態為ABSENT
// only force lock screen in case of missing sim if user hasn't gone through setup wizard
當sim卡狀態為 PUK_REQUIRED :即輸入PIN失敗。(調用PUK解鎖屏)
2. 設置的自動鎖屏時間out
都是通過KeyguardViewMediator.java啟動。
一. 開機啟動
在開機過程中無線模塊初始化時獲取SIM卡,狀態。在初始化完成后調用vm.systemReady()函數通知進入相應的Lock Screen進行解鎖。
1. 在hardware/ril/reference-ril/reference-ril.c中:
通過 setRadioState (RADIO_STATE_SIM_NOT_READY) 來觸發對無線模塊的初始化。
通過 static void onRadioPowerOn() 對無線模塊初始化。
首先通過pollSIMState(Null):輪詢sim卡狀態。
由getSIMStatus()函數獲取sim卡狀態。
2. 當系統初始化完成后 會調用wm.systemReady()函數,觸發解鎖界面。
VM:WindowManagerService wm = null;
由于WM為空,調用WindowManagerService中函數:
public void systemReady () {
mPolicy.systemReady();
}
mPolicy: final WindowManagerPolicy mPolicy = PolicyManager.makeNewWindowManager();
(以下文件在frameworks/policies/base/phone/com/android/internal/policy/impl中)
3. PolicyManager.makeNewWindowManager(),調用文件 PolicyManagerer.java中函數:
public static WindowManagerPolicy makeNewWindowManager() {
return sPolicy.makeNewWindowManager();
}
4. sPolicy.makeNewWindowManager 調用的是文件 Policy.java中函數:
public PhoneWindowManager makeNewWindowManager() {
return new PhoneWindowManagerwv
}
5. PhoneWindowManager 繼承自 WindowManagerPolicy
mPolicy.systemReady() 最終調用的是文件 PhoneWindowManager.java 中的函數:
public void systemReady();
mKeyguardMediator.onSystemReady();
doKeyguard();
showLocked();
Message msg = mHandler.obtainMessage(Show);
mHandler.sendMessage(msg);
發送SHOW消息。
6. public void handleMessage(Message msg) 對 SHOW 消息進行了處理。
如果 msg.what 等于 SHOW 那么執行:
handleShow();
private void handleShow()
...
mCallback.onKeyguardShow();
mKeyguardViewManag.show()
7. mKeyguardViewManager.show() 調用的是文件 KeyguardViewManager.java 中的函數:
public synchronized void show()
...
mKeyguardView = mKeyguardViewProperties.createKeyguardView( mContext, mUpdateMonitor, this);
...
8. mKeyguardViewProperties.createKeyguardView
調用的是文件 LockPatternKeyguardViewProperties.java中的函數:
public KeyguardViewBase createKeyguardView(Context context,
KeyguardUpdateMonitor updateMonitor,
KeyguardWindowController controller) {
return new LockPatternKeyguardView(context, updateMonitor,
mLockPatternUtils, controller);
}
9.? new LockPatternKeyguardView 調用了類 LockPatternKeyguardView 的構造函數:
public LockPatternKeyguardView(
Context context,
KeyguardUpdateMonitor updateMonitor,
LockPatternUtils lockPatternUtils,
KeyguardWindowController controller)
...
mLockScreen = createLockScreen();
addView(mLockScreen);
final UnlockMode unlockMode = getUnlockMode();
mUnlockScreen = createUnlockScreenFor(unlockMode);
mUnlockScreenMode =unlockMode;
addView(mUnlockScreen);
updateScreen(mMode);
其中getUnlockMode 獲得鎖類型,通常有三種:
enum UnlockMode {
Pattern,
SinPIN,
Account
}
createUnlockScreenFor(unlockMode)根據相應的unlockMode而調用對應的解鎖屏。
二. 按紅鍵啟動
點擊結束通話鍵(紅鍵),根據action:
TelephonyManager.ACTION_PHONE_STATE_CHANGE和TelephonyManager.EXTRA_STATE_IDLE
調用frameworks/policies/base/phone/com/android/internal/policy/impl/
KeyguardViewMediator.java中函數:
doKeyguard();
private void showLocked() {
??????? if (DEBUG) Log.d(TAG, "showLocked");
??????? // ensure we stay awake until we are finished displaying the keyguard
??????? mShowKeyguardWakeLock.acquire();
??????? Message msg = mHandler.obtainMessage(SHOW);
??????? mHandler.sendMessage(msg);
}
發送SHOW消息。
之后轉到“開機啟動”的第六步。
三. 其它方式
1. SIM卡狀態改變,當sim卡狀態為ABSENT
// only force lock screen in case of missing sim if user hasn't gone through setup wizard
當sim卡狀態為 PUK_REQUIRED :即輸入PIN失敗。(調用PUK解鎖屏)
2. 設置的自動鎖屏時間out
都是通過KeyguardViewMediator.java啟動。
總結
以上是生活随笔為你收集整理的Android 解锁屏启动过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: selinux-添加
- 下一篇: 如何修改Android应用程序能够使用的