- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
工程师关于开发多窗口应用的点建议
Google工程师关于开发多窗口应用的5点建议 如果你之前浏览过Android N的新特性(需科学上网),你应该已经发现了Android N对多窗口的支持。 当把屏幕拆分成多窗口后,两个APP可以并排可见,如下图所示: sidebysideApp.png 我很兴奋,很想知道背后的原理,于是迅速查看了说明文档,寻找那些实现这一魔术般效果的新的API。 结果有点小失望,我没有发现许多新的API,新的系统只增加了一些XML属性和一些Activity方法。XML属性可以用来说明你的应用是否支持多窗口,Activity方法用来帮你检查Activity是否正处于多窗口模式中。那么,神奇的多窗口功能在哪里实现的呢?答案是Android一直都具备实现多窗口的功能,只不过刚被挖掘出来而已。 秘密就隐藏在Android的资源系统中,该系统最重要的能力就是根据应用所处设备的配置条件和应用中的资源标识符,提供不同的资源,如layouts,drawables,menus等等。举例来说,通过创建一个drawable-sw600dp文件夹,并在其中放置合适的layout资源文件,你的应用可以在大屏幕设备和小屏幕设备上呈现不一样的布局。 多窗口功能的实现正是利用了资源系统的这一特性,根据你的Activity窗口的尺寸调整相应的设备配置条件----最明显的条件就是屏幕尺寸,但同时,最小宽度(即sw值,屏幕宽和高中的较小值)和屏幕方向(orientation)也将随着Activity窗口尺寸的调整而更新。 这就引出了我们的第一条建议。 建议1:使用正确的Context 加载合适的资源需要合适的Context。如果你使用Activity Context来inflate你的layouts,获取资源等等,一切都是正确无误的,尽可放心。 然而,如果你使用 Application context来做任何与UI相关的事,比如加载一个drawable,你将会发现该context完全不知道多窗口这回事,自然也就无法帮你加载合适的资源,除了不使用你为不同配置条件设置的Activity主题外,还可能加载完全错误的资源!!!所以,在多窗口应用中,当你做UI相关的事情时,切记切记使用Activity Context。 建议2:正确处理配置变化 当你使用正确的context时,你就始终可以根据Activity的窗口尺寸获取到正确的资源,不管该窗口是处于全屏状态还是处于与其他应用共享屏幕的分屏状态。每次重新加载资源的过程都基于你怎样处理运行时的配置变化。 应对配置变化的默认处理是销毁整个Activity并重建它、恢复你在onSaveInstanceState()中保存的任何状态、重新加载所有的资源和layouts。这样做的好处有两点: 新建的Activity将会与新的配置条件保持一致。 每一种配置的变化都在重建中得到了处理。 毫无疑问,每种配置的变化都应当得到快速连贯的处理,为此,请不要在onResume中做过多的工作,并考虑使用loaders来确保你的数据不会因配置变化而丢失。 你也可以自己处理配置的变化,在这种情况下,你的Activity(或者Fragment)将不会销毁重建,相反,你将会收到一个onConfigurationChanged()回调,你需要在回调中手动更新你的views,重新加载资源等等。 为了能够catch住多窗口相关的配置变化,你至少需要在清单文件中为你的Activity的android:configChanges属性添加如下值:activity android:name=.MyActivity android:configChanges=screenSize|smallestScreenSize |screenLayout|orientation / 当你自己处理配置变更时,请确保处理好每一个可能发生变化的资源。 这里所说的“每一个可能发生变化的资源”包括一些在单窗口环境中被认为不会发生变化的资源。比如,你在values和values-sw600dp文件下有一个dimension。在单窗口应用时代,你永远不会在应用运行时切换这个dimension,因为最小宽度(smallest width)是不会变化的,它永远是你的设备的高和宽中的较小值。然而,在多窗口应用时代,当你的应用发生resize时,你将不得不在不同的dimension之间切换。因为此时,最小宽度这项配置将不再是一个常量,而是一个变量。 建议3:处理所有的方向(orientations) 本文开始时,我们提到,当Activity的窗口resize时,orientation这项配置将会发生变化。是这样的:即使设备处于水平(landscape)方向,你的应用也可能处于“竖直(portrait)”方向。 这
文档评论(0)