2014-02-27 18:13 1207人阅读 评论(0) 收藏 举报

最近在看一个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运行之后,切换语言,他销毁了一次,又重新启动了,导致状态栏上有了通知提示。

最新文章

  1. assign、copy 、retain等关键字的含义
  2. [Node.js] DSL in action
  3. 字符匹配算法之KMP
  4. Android网络访问库 - Retrofit学习(1)基础
  5. PL/SQL中查询某的时间段内所有执行的sql
  6. hdu 2199 Can you solve this equation?(高精度二分)
  7. OJ网站程序员必备
  8. OpenJudge 2817:木棒 / Poj 1011 Sticks
  9. Linux vmstat具体解释(系统IO)
  10. poj crane
  11. ASP.NET - TreeView
  12. chapter9_2 管道与过滤器
  13. OpenLayer 3 鼠标位置坐标显示控件
  14. Viewpager以及ViewPagerIndicator的相关使用
  15. BFC详解
  16. 花生壳DDNS为何不支持LetsEncrypt申请
  17. MySQL中时间函数NOW()和SYSDATE()的区别
  18. Linux下的硬链接与软链接
  19. Python_文本操作
  20. mysql数据库通过二进制 -【恢复数据记录】

热门文章

  1. magento后台无法登陆的问题
  2. python unittest基本介绍
  3. js&html5实现消星星游戏
  4. SQL server 为多个表添加新的列
  5. GET和POST测试(支持需要登录的接口调用:高级功能->填写cookie)
  6. TCP三次握手和四次挥手协议
  7. 一个字典通过dictionaryWithDictionary 他们的内存指针是不同的
  8. iOS 限制UITextField输入字符
  9. 机器学习 —— 概率图模型(Homework: CRF Learning)
  10. Docker基础技术:DeviceMapper