Launcher: 解决添加 Settings 快捷方式 bug_序

来源:互联网 发布:东北证券炒股软件 编辑:程序博客网 时间:2024/04/29 18:28

Launcher 前段时间一直在研究,主要是客户的要求特别多,头大!


不管怎么说 Launcher 还是比较重要的,他就像 android 的一张脸,这跟《非诚勿扰》差不多,长的不好,中标的机率也不会高。呵呵,娱乐一下!


相信,做过 Launcher 移植的人都会发现,添加 Settings 的快捷方式(如 wifi 设置、蓝牙设置)到桌面之后,改变系统语言设置,但是刚才添加的  Settings 的快捷方式语言是不会变的!

这是 android 的 bug!!!!!!

原来以为 android4.0 会解决这个问题,但是 Google 还是让人失望了一把。不过解决这个 bug 也不是很难,在后面的博文中,我会分享一下自己解决这个问题的方法,只是个人认为的办法,忘高手切莫见笑!

要想解决这个问题,首先需要知道 Launcher 添加快捷方式的原理,以及 Settings 如何响应 Launcher。

说到这里,可能要让大家失望了,因为这篇博客只是为后面解决这个 bug 做铺垫的,所以,该篇是打酱油的!
呵呵,如果你读到这篇博文,请不要生气。我会在下面分享关于 android 如何使用代码获取系统语言属性(这个很重要,是我解决这个 bug 的关键)。

使用下面代码:

         // 获取语言代码
        String lCode = Locale.getDefault().getLanguage();
        // 获取国家码
        String lCountry = Locale.getDefault().getCountry();
        Log.d("mark", "lCode *  lCountry = " + lCode + " * " + lCountry);

ok, 运行 app,就可以获取语言信息。比如:en_US,zh_CN,zh_TW

除了上面哪种方式之外,还有一种方式,不过需要编译 android 源码,比较复杂。如果你是做 android 源码开发的话,就不会那麽复杂!

        String l = android.os.SystemProperties.get("persist.sys.language");
        String c = android.os.SystemProperties.get("persist.sys.country");
        Log.d("mark", "l * c = " + l + " * " + c);

看 SystemProperties 源码可以知道这个类是 hide 的,所以需要编译 android 源码。

现在说一下具体流程。


1. eclipse 新建一个 android project: DemoPro


2. 在工程目录下面新建一个 mk 文件:Android.mk

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_PACKAGE_NAME := mark
LOCAL_PROGUARD_ENABLED := full
include $(BUILD_PACKAGE)

当然,你可以从 android 源码 package/app 中任何一个工程中 copy 一份。

注意:LOCAL_PACKAGE_NAME := mark 表示编译之后 apk名称,即 out/target/product/generic/system/app/mark.apk

特别注意:如果你的 mk 文件中有:

LOCAL_SDK_VERSION := current

请将这句注释掉,否则编译会报错。


3. 编译 app

拷贝 DemoPro 到 /packages/apps

编译:mmm -j4 /packages/apps/DemoPro


4. 安装 apk 到模拟器

adb -e install out/target/product/generic/system/app/mark.apk

5. 运行即可看到结果


如果,你有其它问题,可以参考 android 源码 PhoneBase.java 中 setSystemLocale 方法。