分享一些冷门的新版本 Android API 改动

@fython  April 10, 2018

在你的应用程序详情信息中加上 “设置” 入口

Android 7.0 (API 24) 开始,加入了一个新的 Intent action:Intent.ACTION_APPLICATION_PREFERENCES(值为android.intent.action.APPLICATION_PREFERENCES)。

在你的设置 Activity 的 Manifest 声明中的 <intent-filter> 标签内加上:

<action android:name="android.intent.action.APPLICATION_PREFERENCES"/>

然后打开你的应用程序的详情信息,便可以发现多了一个小齿轮在信息 Header 右边,点击之后将会跳转到你设置好的 Activity。

app_info_header.png

值得一提的是,即便你对这个 Activity 设置了 android:exported="false",它也依然能够被系统设置打开。根据 CommonsWare 博客 的一篇文章,你还可以通过对 Activity 设置 android:permission="android.permission.WRITE_SECURE_SETTINGS" 来限制为只有系统设置能打开。

用途?

Android 生态中,在应用主界面的菜单或者导航抽屉中放入 “设置” 入口的做法应该有 99% 的应用都会选择这么做,通常只见隔壁 iOS 会将应用程序设置置入系统设置中,生态不同习惯也不同,无法分出好坏。显然这个只有 Android 7.0 开始才支持的新特性,大部分用户都不会想到,保留在主界面的 “设置” 入口是必须的~

一些不需要经常打开/一次性设置完成的工具会考虑 “洁癖” 用户做一个从启动器上隐藏图标的功能,隐藏之后缺少一个便捷的方法重新找回,这时就可以用上 Intent.ACTION_APPLICATION_PREFERENCES 让用户重新进入设置了。

粤语语言支持?!

Google 在 Android 8.0 中悄悄地支持了 “粤语” 作为界面语言,尽管过去的版本已经有 “繁体中文(香港)”,即 zh-rHK,但 “繁体中文(香港)” 对应的是比粤语更加书面的表达方法。

languages.png

截图中可以看到 “粤语(香港)” 一行下写着 “部分應用程式可能不提供支援”,确实很多应用程序不可能照顾到很多语言,但开发者适配粤语的时候除了将对应资源放在正确的目录下,还要注意 Locale.getDefault() 获得到的不是粤语的 Locale 对象,而是繁体中文香港的 Locale 对象。

locale_getdefault.png

要正确的获得粤语的 Locale 对象,应当通过 Android 7.0 中新加入的 LocaleList 的静态方法 getDefault() 获得到用户当前的语言列表:

localelist_getdefault.png

可以看到第一个就是粤语的 Locale 对象了,当时我也有些惊讶,语言代码不是 zh 而是 yue

那么我们在放置 string.xml 资源的时候是放在 values-yue 文件夹,而不是 values-zh-rYUE 或者 values-zh-rHK

Note: 我在第一次适配的时候尝试了几次没有找到正确的位置,被 Locale.getDefault() 骗了,而网上也没有人尝试过粤语的适配,浪费了一些时间qwq

意义?

生在广东以粤语为母语的地区,和同以粤语为母语的学校朋友文字交流时也会用到粤语,我对语言学不了解,私以为粤语只适合作为口头语言,但确实都有对应的字型(部分为生僻字)而不是全靠谐音/拼音去表达。

为 Android 应用程序适配粤语的意义大概更多的是给粤语使用者亲切感,而不是为了让他们能看懂功能流畅使用,毕竟本来就看得懂更书面化的繁体中文(香港),或是简体中文和繁体中文(台湾)。

仅建议自身对粤语有兴趣的独立开发者考虑适配。

归类你的应用

这个新 API 在 官方文档 也有提及。

Android 8.0 开始提供了一个 android:appCategory 的 Application manifest 属性,在用户查看移动数据、电量和储存空间使用情况时,系统会将相同分类用途的应用归并起来,便于用户了解情况。

storage_settings.png
storage_settings_games.png

其它应用也可以通过 ApplicationInfo 的成员变量 category 获取,从 Android Developers 官方参考文档 可以知道有八种分类:音乐、游戏、图像、地图、新闻、生产力、社交网络、视频。-1 则为未定义。

值得一提的是,当应用开发者没有主动设置 appCategory,有可能由包安装器通过 PackageManager#setApplicationCategoryHint(String, int) 为应用设置,猜测是由 Google Play Store 通过应用发布的分类去自动设置。(源码参考

主动请求关闭电池优化

官方文档

Android 6.0 开始的引入了更强的节电机制,一些对时效性要求很高(而不是扰人又无关紧要的新闻推送)的系统工具类应用会因此受到影响,可能导致定时功能不能正常运作。

通过 PowerManager#isIgnoringBatteryOptimizations(String packageName) 可以主动检查是否在电池优化白名单内。

应用声明需要 REQUEST_IGNORE_BATTERY_OPTIMIZATIONS 权限后,可以触发 Action 为 ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS 的 Intent 打开系统对话框询问用户是否关闭电池优化。

不过,一般的新闻、社交网络应用应该正确的使用 Google 官方的 Firebase 推送服务或者 JobScheduler 去做定时任务处理,而不是随意要求用户开通“绿色通道”。对于国内无法使用 Google 推送的情况,请参考其它国内开发者的做法,这里不予介绍。


添加新评论