`
unicorn25
  • 浏览: 67065 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

froyo系统原生bug及修正:改变系统语言时Launcher2的AllApps内shortcut不刷新

阅读更多

把froyo的Launcher2移植到eclair后,产生了一些小问题,都一一解决掉了.这是市场反馈回来的一个问题之一,摸清内部机制颇废了一番周折.也算见识了android系统内部的另一个面向切面编程案例,很有必要记录一下,有时间好好研究研究,可以借此做些特殊的系统功能.

 

严格意义上说,这并不是跨版本移植产生的问题,而是系统原生的一个bug,用samsung的galaxy tab平板模拟器测试同样是此现象:当在Launcher里面启动Settings,改变语言设置后,再回到Launcher,AllApps2D里面的shortcuts文字部分并不随之更新,还是保持原样.其它部分却已更新.

 

察看Settings源码可以知道,设置语言,改变的只是执行了如下代码:

        try {
            IActivityManager am = ActivityManagerNative.getDefault();
            Configuration config = am.getConfiguration();

            Loc loc = mLocales[position];
            config.locale = loc.locale;

            // indicate this isn't some passing default - the user wants this remembered
            config.userSetLocale = true;

            am.updateConfiguration(config);
            // Trigger the dirty bit for the Settings Provider.
            BackupManager.dataChanged("com.android.providers.settings");
        } catch (RemoteException e) {
            // Intentionally left blank
        }
        finish();
 

 

在configuration改变后,系统会让每一个切换到前台的Activity destroy,然后重新加载至原位置,非常奇妙的刷新操作,有时间要看看他如何保存当前状态的代码,比如,当前切换到前台的Activity是launcher,则会一直加载到allapps2d打开,而不是oncreate完成后的初始位置.对于状态机学习来说,Launcher无疑是很好的教科书.

 

然而,configuration的控制范围只是所有的Activity,Activity实现了一个接口ComponentCallbacks,里面有:

 

    /**
     * Called by the system when the device configuration changes while your
     * activity is running.  Note that this will <em>only</em> be called if
     * you have selected configurations you would like to handle with the
     * {@link android.R.attr#configChanges} attribute in your manifest.  If
     * any configuration change occurs that is not selected to be reported
     * by that attribute, then instead of reporting it the system will stop
     * and restart the activity (to have it launched with the new
     * configuration).
     * 
     * <p>At the time that this function has been called, your Resources
     * object will have been updated to return resource values matching the
     * new configuration.
     * 
     * @param newConfig The new device configuration.
     */
    public void onConfigurationChanged(Configuration newConfig) {
        mCalled = true;

        if (mWindow != null) {
            // Pass the configuration changed event to the window
            mWindow.onConfigurationChanged(newConfig);
        }
    }

 

 

而对于Launcher来说,allapps里面的内容是通过LauncherModel.java里面的线程类去异步加载的,重启Launcher这个Activity,并不会让LauncherModel里面的缓存的allapps内容刷新,Launcher是直接拿了LauncherModel里面缓存的query数据而不是通知loader线程重新获取,问题就出在这里了.

 

解决的方法并不复杂,Launcher在调onCreate()的时候,会调用checkForLocaleChange()方法检查是否语言设置是否被修改,我们定义一个boolean类变量,把语言设置是否改变存到里面,然后为LauncherModel重构一个startLoader方法,在onCreat()代码的相应位置调用此重构方法,把状态值传进去.在内部类Loader的loadAndBindAllApps()方法里,增加判断条件让语言改变时走loadAllAppsByBatch()路线即可.

 

我们来看看可以从中学到些什么?

1\定义和使用configuration的类变量,可以很好的传递任何全局数据,可以和硬件方便的通信.

2\利用configuration控制framework各模块ui.一个简单例子,在launcher中,利用语言设置变化,显示或隐藏不同语言环境的应用,比如面向国内市场的机器,youtube反正用不上,就可以隐藏掉.加上youku.平板电脑没有phone功能的,把phone的shortcut给拿掉.

3\另一个想法,能否利用configuration绕过系统权限实现截屏等需要root权限的功能?

分享到:
评论
3 楼 烧伤的火柴 2012-03-05  
你好!你的文章没有配置.xml
我不太明白  能否再详细一点
loadAllAppsByBatch()这个方法在哪里?
2 楼 zhmeup 2011-07-26  
setting下的子菜单快捷方式 偶跟了两天,快有结果了
1 楼 zhmeup 2011-07-26  
验证没? loadAllAppsByBatch能更新setting下的子菜单快捷方式?

相关推荐

    froyo Launcher2源码

    【froyo Launcher2源码】是Android操作系统版本2.2(代号Froyo)中的主启动器应用的源代码。这个启动器是用户与Android系统交互的主要界面,负责管理桌面图标、小部件和应用抽屉。由于它是开源的,开发者可以深入...

    android Launcher2.2源码

    在深入理解Android系统工作原理时,学习Launcher的源码是非常重要的一环。这里我们主要探讨的是Android 2.2(Froyo)版本的Launcher源码。 1. **Launcher结构分析** Launcher由多个关键组件构成,包括Activity、...

    Launcher源码

    在Android 2.2(Froyo)版本中,Launcher的源码为我们揭示了系统如何构建这个至关重要的组件。通过深入分析源码,我们可以了解其核心功能、工作原理以及可扩展性设计。 1. **Launcher架构** Android 2.2的...

    android Launcher2.20 源码

    Android Launcher2.20 是Android操作系统中的主屏幕应用的源代码,它负责显示应用程序快捷方式、小部件和其他桌面元素。这个源码版本对应的是Android 2.2(Froyo)系统,对于开发者来说,深入理解这个源码可以帮助...

    froyo_frameworks_froyo_frameworks

    在Android系统架构中,框架层是操作系统的核心,它提供了API接口供应用程序开发者使用,并且包含了系统服务、系统库以及运行时环境等关键组件。这个压缩包可能包含了该版本框架层的源代码或者编译后的二进制文件。 ...

    安卓系统苹果桌面工具

    描述中提到的“支持系统2.23系统及以上”,这表明该苹果桌面工具兼容Android 2.23(可能指的是Android Froyo版本)及更高版本的操作系统。这意味着拥有这些版本的安卓设备都可以安装并运行这个应用,享受iOS样式的...

    C8600内置程序列表(Froyo 2.2).rar

    标题中的"C8600内置程序列表(Froyo 2.2).rar"指的是针对Samsung C8600手机的一款操作系统升级,该升级基于Android 2.2(Froyo)版本。Android Froyo是Google Android操作系统的一个重大更新,带来了多项性能优化和新...

    froyo_packages_02_apps

    标题 "froyo_packages_02_apps" 暗示我们正在讨论的是与Android系统相关的知识,特别是关于“Froyo”(Android 2.2)版本的应用程序包。Froyo是Android操作系统的一个重要里程碑,它在2010年发布,带来了许多性能...

    froyo_03_packages_01

    标题 "froyo_03_packages_01" 暗示了我们正在讨论的是与Android操作系统的一个特定版本——Froyo(冻酸奶),即Android 2.2相关的软件包集合。Froyo是Android历史上的一个重要里程碑,因为它带来了许多性能优化和新...

    安卓Android源码——高仿基于2.2(Froyo)的Contacts.zip

    《安卓Android源码解析——深度探索基于2.2(Froyo)的Contacts应用》 在Android操作系统中,Contacts应用是用户日常接触最频繁的应用之一,它负责管理设备上的联系人信息。本篇将深入探讨基于Android 2.2(Froyo)...

    Laucher 上下左右循环滑动workspace代码修改(新)

    (之前上传的代码有bug,经过作者整理和修改,fix掉部分bug) Android Launcher关于屏幕滚动管理的类Workspace,可以在此下载: ...

    Android教程之认识Android系统

    Android系统内置权限管理系统,每个应用在安装时需申请相应的权限。用户可以选择接受或拒绝,以保护个人隐私。 通过这个“Android教程之认识Android系统”,你将了解到Android系统的核心原理、开发流程以及如何...

    froyo_frameworks_01_base-01

    标题 "froyo_frameworks_01_base-01" 暗示了这是一个与Android系统相关的项目,更具体地说,是针对Android Froyo(2.2版本)的框架层组件。Froyo是Android操作系统的一个重要版本,发布于2010年,它在效能和功能上...

    Android应用源码之高仿基于2.2(Froyo)的Contacts.rar

    这篇文档将深入探讨Android应用源码中的一个经典案例——高仿基于2.2(Froyo)版本的Contacts应用。Froyo,即Android 2.2版本,是Android操作系统的一个重要里程碑,它引入了许多性能优化和新特性。通过研究这个高仿...

    2.2系统开启APP2SD.rar

    标题中的“2.2系统开启APP2SD.rar”指的是Android操作系统的一个特定版本,即Android 2.2(Froyo),以及与之相关的APP2SD功能。APP2SD(Application to SD Card)是Android系统中的一项特性,允许用户将应用程序的...

    Android系统移植技术详解

    Android系统移植技术是一个复杂而精细的过程,涉及到多个层面的工作,包括环境配置、代码编译、设备驱动移植以及系统服务的定制。以下是对标题和描述中所提及知识点的详细解释: 1. **Android系统开发编译环境配置*...

    小程序源码 高仿基于android2.2(Froyo)的Contacts.zip

    2. 数据管理:为了存储和检索联系人数据,源码可能使用了SQLite数据库,这是Android原生提供的轻量级数据库系统。此外,数据操作的API可能被封装在适配器类中,以便于与UI进行交互。 3. 搜索与过滤:Froyo的...

    froyo_frameworks_01_base-02

    标题 "froyo_frameworks_01_base-02" 指向的是Android系统的一个特定版本,Froyo(冻酸奶),这是Android操作系统的2.2版本。在这个版本的框架层,我们可以深入探讨以下几个关键知识点: 1. **Android Framework**...

Global site tag (gtag.js) - Google Analytics