Settings: android 組件如何響應語言變化

原文:http://blog.csdn.net/androidbluetooth/article/details/7182541

這裏所說的 android 組件,主要是指 android 中 Activity、Service、ContentProvider 以及 BroadcastReceiver.


在 android 源碼開發的過程中,大家拿到手的都是一樣的 android 源碼,但是硬件平臺卻是大相徑庭,所以會引發各種各樣的問題,於是乎,android 開發越發精彩!


這篇博客主要是在研究 Settings 源碼時所激發的,把自己的經驗拿出來分享一番!


我在設置語言之後,發現有些地方的語言還是沒有改變,這個時候想起了 onConfigurationChanged 方法,先來看看這個方法。


public interface ComponentCallbacks


這個接口包括兩個方法,其中一個就是onConfigurationChanged 方法。

Activity、Service、ContentProvider 都實現了這個接口,所以在代碼中,我們可以重寫這個方法,便於回調處理。那麼,這個方法何時纔會被回調呢?


abstract voidonConfigurationChanged(Configuration newConfig)
Called by the system when the device configuration changes while your component is running.


設備配置發生變化的時候,就會回調。你可能實在憋不住要問,設備配置指哪些?

android:configChanges=["mcc", "mnc", "locale",
                      "touchscreen", "keyboard", "keyboardHidden",
                      "navigation", "screenLayout", "fontScale", "uiMode",
                      "orientation", "screenSize", "smallestScreenSize"]

這裏需要提醒一下,如果使用 Activity 配合 onConfigurationChanged 方法,需要在其 menifest.xml 中添加:

android:configChanges 屬性。


所以,如果你有需要可以在上面的三大組件中重寫該方法,做你自己的邏輯處理!


如果,在 Settings 裏面改變語言之後,在我們其它的 App 中可以註冊某個廣播就可以接收到這種變化,就更好了!

恩,當然可以!


註冊一個廣播:
  1. <span style="font-size:18px;"><span style="font-family:'Comic Sans MS';">IntentFilter filter = new IntentFilter();  
  2.         filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED);  
  3.         registerReceiver(receiver, filter);</span></span>  

接收廣播:

  1. <span style="font-size:18px;"><span style="font-family:'Comic Sans MS';">private BroadcastReceiver receiver = new BroadcastReceiver() {  
  2.           
  3.         @Override  
  4.         public void onReceive(Context context, Intent intent) {  
  5.             String action = intent.getAction();  
  6.             if("android.intent.action.CONFIGURATION_CHANGED".equals(action)) {  
  7.                 // to do  
  8.             }  
  9.         }  
  10.     };</span></span>  

別忘記在合適的位置取消註冊:

unregisterReceiver(receiver);


這樣做的話,要比直接重寫onConfigurationChanged 方法,更加靈活,因爲有些沒有實現這個接口的android組件一大把,但是接收廣播對於大多數組件來說還還是比較簡單的!在以後的博客中,我和大家交流一下關於自定義的View如何接收廣播!


關於 Intent.ACTION_CONFIGURATION_CHANGED,可以參考 sdk 文檔。


有的人說,我現在只關心設備語言變化的那個 action,到底有木有?有!


Intent.ACTION_LOCALE_CHANGED

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章