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 方法。