標籤:android blog http io ar java for sp on
最近在看一個bug,系統切換語言後,本來退到背景音樂,會在通知欄上顯示通知。為瞭解決這個bug,我學習了下android的語言切換流程,也參考了大量其他人的資料。(主要參考了http://blog.csdn.net/wqhjfree/article/details/8244520)在這裡我將自己的探索記錄下來,作為自己的學習記錄,也希望能對有同樣需要的人有個協助。剛學android不久,如果中間有什麼問題不對的請多多諒解,並指出錯誤,多交流,共同進步下。
1.從setting入手,我們可以知道,在setting中,語言設定的入口在一個叫做LocalePicker的類裡面,當點擊裡面的一個語言後會調用 onLocaleSelected(final Locale locale)方法。通過分析這個方法我們可以知道,最後切換語言並不是在這裡完成,而是去調用了fromwork下的updateLocale()方法(位於frameworks/base/core/java/com/android/internal/app/LocalePicker)。
2.居然他是調用的fromwork下LocalePicker類中的updateLocale()方法,我們繼續往下看。通過分析,我們知道這個方法也不是一個最終的處理方法,而是去調用了ActivityManagerService.java中的updateConfiguration()函數。
3.看看updateConfiguration()方法做了什麼事情,這裡做了一些值得判斷和初始工作。最重要的是他調用的updateConfigurationLocked(values, null, false, false)方法;
4.updateConfigurationLocked中主要做了兩件事:(1)改變現在的 configuration(這是一個系統配置的類,有興趣的可以去瞭解下);(2)確保所有正在啟動並執行Activity都運行改變後的configuration。下面可以看看他到底是怎麼完成這兩件事的。首先,通過updateFrom(values)判斷是不是真的語言發生了變化,如果改變了,從if條件走,在if裡面,前面做一些判斷之類的工作,到此也完成了第一步的工作。最重要的是for迴圈裡面的操作,首先得到了所有運行過的app的集合,然後對每個app調用scheduleConfigurationChanged()方法,進行語言的切換工作。
5.scheduleConfigurationChanged是在ActivityThread中,這個方執行了 updatePendingConfiguration(config)和 queueOrSendMessage(H.CONFIGURATION_CHANGED, config)兩個方法。前面一個方法是更新Configuration;最主要的操作在queueOrSendMessage()裡面的handleConfigurationChanged((Configuration)msg.obj, null)方法中。
6.接著對handleConfigurationChanged進行分析,從中我們不難發現applyConfigurationToResourcesLocked()這個是一個重新設定資源的函數,performConfigurationChanged(callbacks.get(i), config)這個方法是執行Configuration的改變。即最終完成語言的切換。
7.詳細的分析下applyConfigurationToResourcesLocked做了哪些工作,updateFrom(config) 把config更新到Configuration中,後面 最主要的是在while () 中做了資源更新和刪除就資源的操作。
8.performConfigurationChanged方法中,這是完成語言切換的最後一步了,首先判斷當前activity的config和新的config是否一樣,如果是一樣什麼都不做;如果不一樣,則重啟app,重新載入資源達到切換語言。
9.總結語言切換的大概流程是,判斷configuration中的local即語言是不是有改變,如果有改變即為要切換語言。執行切換語言的時候,對那些已經運行過的程式,執行一個資源的清除和重新載入的過程,就完成了整個系統的語言切換。
最後,那個bug也就迎刃而解了,music運行之後,切換語言,他銷毀了一次,又重新啟動了,導致狀態列上有了通知提示。
轉自:http://blog.csdn.net/liuweizwcxx/article/details/20036787
【轉】Android 語言切換過程分析