【轉】Android 語言切換過程分析

來源:互聯網
上載者:User

標籤: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 語言切換過程分析

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.