添加用户信息的方法java_添加用户的流程分析
添加用戶的流程分析
Settings的上層接口
settings中的文件:
/android/packages/apps/Settings/src/com/android/settings/users/UserSettings.java
/android/vendor/samsung/packages/apps/Settings/res/xml/user_settings.xml
添加用戶item的key值為Preference key="user_add"
點擊item之后,根據型號的不同分為兩個不同的選擇:
mCanAddRestrictedProfile == true 可以對不同的權限進行添加
mCanAddRestrictedProfile != true 一般型號是不能進行更深層次的管理的
->
彈出DIALOG_ADD_USER的對話框之后,對于有通話功能的平板,會有一個選擇是否同意數據的過程
選擇完就是dialog的本體了,layout在前面會有個簡單的設置
其中的userType的值也是根據之前mCanAddRestrictedProfile來的,兩者相互交叉,統一在這個地方就行用戶的添加,一般型號的是走USER_TYPE_USER的流程。addUserNow(final int userType)方法是一個較長的方法,其中主要是包含一個新建用戶的線程,在線程中會針對userType的不同新建不同級別的用戶。
咱走的是USER_TYPE_USER, 在createTrustedUser方法中完成用戶的新建,這里我們能看到新用戶命名的過程以及新建用戶的真正接口
新建完用戶之后立即會起一個dialog,這個dialog是詢問用戶是否要立即切換至新用戶(這個動作就會起用戶的Setup),我們得搞明白這個流程,到底switchUserNow的過程中做了些什么
可以看到切換用戶的接口是ActivityManagerNative的方法
切換用戶流程
切換用戶接口文件:
/android/frameworks/base/core/java/android/app/ActivityManagerNative.java
/android/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
/android/frameworks/base/services/core/java/com/android/server/am/UserSwitchingDialog.java
/android/frameworks/base/services/core/java/com/android/server/SystemServiceManager.java
/android/vendor/samsung/packages/apps/Settings/src/com/android/settings/ManagedProfileSetup.java
/android/frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java
ActivityManagerNative類的getDefault 方法返回的是ActivityManagerService這個類的一個對象,ActivityManagerService的switchUser方法較為復雜,但也分為了很多小模塊。
1、拿到切換到的userId對應的UserInfo,然后啟動一個切換用戶的dialog
2、在這個dialog里面對切換用戶的信息有一些簡單的設置用來作為顯示,最主要的是回調了ActivityManagerService中的startUserInForeground方法,通過這個來進行用戶的切換。
3、startUserInForeground直接轉到startUser(final int userId, final boolean foreground)方法,在startUser中管理用戶的啟動,過程比較復雜,涉及到各個狀態的處理。我們把這些過程也分為幾個流程塊:
A、啟動新用戶的準備工作,主要包括windowManagerService的窗口處理,userid的添加,啟動過程對于window的凍結三部分,由于foreground值為true,我們只需要看前臺啟動的部分就行了。
B、獲取user的狀態,對于不同狀態的處理方式,主要包括四種狀態:STATE_STOPPING、STATE_SHUTDOWN、STATE_BOOTING和STATE_RUNNING,若是前兩種狀態則要讓狀態回到STATE_BOOTING,以啟動user,啟動完之后發一條消息:SYSTEM_USER_START_MSG,這條消息由SystemServiceManager來處理,啟動新用戶
C、第三部分在systemService結束啟動用戶之后,會連續地發幾個廣播:SYSTEM_USER_CURRENT_MSG、REPORT_USER_SWITCH_MSG、USER_SWITCH_TIMEOUT_MSG,這幾個廣播處理較復雜,稍等
D、接下來是檢測User是否被初始化,若未初始化則發廣播給接收處理用戶初始化的文件就行初始化,intent為Intent.ACTION_USER_INITIALIZE= android.intent.action.USER_INITIALIZE,這一初始化是在settings中完成的: ManagedProfileSetup.java
這里面會對新用戶的某些數據庫進行設置
重要的方法是onUserInitialized(uss, foreground, oldUserId, userId)方法,這個方法就能能起Setupwizard的方法
onUserInitialized(uss, foreground, oldUserId, userId)方法調用moveUserToForeground方法引出startHomeActivityLocked(newUserId)方法進行Home級別的Activity啟動
E、startHomeActivityLocked方法主要是根據userId判斷啟動Home級以及優先級最高的app(SetupWizard優先級比Launcher2更高),由getHomeIntent方法進行遍歷。遍歷完之后取到home級別的app,由startHomeActivity方法來啟動。startHomeActivity方法是在下面這個文件中寫的:
/android/frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java
ActivityManagerNative中也有設置switchUser的接口,其對switchUser方法的寫法如下,把需要切換到的user的id傳到mRemote中用transact方法進行進一步的解析工作。那么mRemote是個shen me gui 呢?
PS:關于Parcel,Parcel其實是一個存放讀取數據的容器, Android系統中的binder進程間通信(IPC)就使用了Parcel類來進行客戶端與服務端數據的交互,而且AIDL的數據也是通過Parcel來交互的。在Java空間和C++都實現了Parcel,由于它在C/C++中,直接使用了內存來讀取數據,因此,它更有效率。
Parcel的方法:
l? obtain()??? 獲得一個新的parcel ,相當于new一個Parcel對象
l? writeInterfaceToken(String interfaceName)?? 寫入接口句柄,相當于把接口的文件路徑給此Parcel
l? writeInt(int)???? 寫入一個整數
l? readException()??????? 在Parcel隊頭讀取,若讀取值為異常,則拋出該異常;否則,程序正常運行
l? recyle()???? 清空、回收parcel對象的內存
其中String descriptor = "android.app.IActivityManager";
由此我們可以看到switchUser方法new了兩個內存區data、reply,data中存放了Binder機制的客戶請求的服務端路徑、需要切換到的用戶id。mRemote其實是Ibinder 的一個對象,它把1、客戶端請求的動作類型SWITCH_USER_TRANSACTION(int SWITCH_USER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+129);2、服務端源、用戶id;3、一段返回內存區reply傳到Binder里進行處理。
新建用戶流程
新建用戶接口文件:
/android/frameworks/base/core/java/android/os/UserManager.java
/android/frameworks/base/services/core/java/com/android/server/pm/UserManagerService.java
其中mService是(UserManager) context.getSystemService(Context.USER_SERVICE);用戶的新建由這個服務來完成
我們拿到UserManagerService文件中關于createUser(String name, int flags)的寫法:
可以看到新建用戶的主要工作一、是在存儲區里面開辟一塊用戶區域二、是發一個已經創建了新用戶的廣播。
總結
以上是生活随笔為你收集整理的添加用户信息的方法java_添加用户的流程分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java配置dbeaver_ubuntu
- 下一篇: java.lang包怎么用_java.l