Android N新特性-多窗口模式适配

Android N

我们都知道 Android N 带来了多窗口的新特性,这样我们的App在适配android N的时候肯定要做一些适配工作。

  • 1. 多窗口模式的开关

默认情况下,我们的App都是允许多窗口的,但是,如果没有进行属性的设置,会系统会抛出一个提示这个应用可能不支持多窗口模式,其实就是android系统不知道开发者是否为该App做了适配工作

那么,如果我们的应用要支持这个模式并且不让这个消息弹出来,要怎么做呢?

很简单,只需要在Activity声明的时候加入一个属性resizeableActivity,并且设置其值为true即可:

<activity
    android:name=".MainActivity"
    android:resizeableActivity="true">
    <intent-filter>
       <action android:name="android.intent.action.MAIN"/>
    <category android:name="android.intent.category.LAUNCHER"/>
    </intent-filter>
</activity>

这个属性的设置会导致三种情况:

① 如果不声明这个属性,那么默认允许进入多窗口模式,但是会有上面图片的提示(第一次运行的时候)
② 如果声明了这个属性,并设置值为true,那么允许进入多窗口模式,并且不会提示
③ 如果声明了这个属性,并设置值为false,那么不允许进入多窗口模式,只允许全屏显示

若应用targetSDKVersion为N,则该应用下所有Activity的resizeableActivity属性均默认为true,即该应用下的所有Activity均能支持多窗口显示。

若Activity1配置resizeableActivity为true,Activity1、Activity2、Activity3均处于同一Task,则Activity2和Activity3均能在多窗口下显示(即使Activity2和Activity3没有配置resizeableActivity属性)。
若Activity2需全屏显示,则需按以下步骤配置:
1、设置resizeableActivity为false
<activityandroid:name="com.exmaple.Activity2"
android:resizeableActivity="false

2、Activity1启动Activity2时,设置FLAG_ACTIVITY_NEW_TASK,Activity2运行在单独的Task,即和Activity1不在同一Task。

Intent intent= newIntent(this,Activity2.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
  • 多窗口模式的适配

当我们允许App进入多窗口模式之后,App只能占据屏幕的一部分


demo

可以看到,在App的上半部分是一个蓝色的图片背景,在上面显示了当前的天气状况,但是如果我们不进行适配,那么进入了多窗口模式之后,这个部分的内容就会几乎占满整个窗口,这个时候我们就需要进行一下适配,当进入多窗口模式之后更换掉这一个布局,将内容进行重新排版,以便显示更多的内容。

多窗口下对应用窗口大小缩放,会触发Configuration变化,可能的变化有screenSize、smallestScreenSize、layoutDirection、screenLayout、orientation,建议Activity的manifest配置configChanges,否则Activity将被销毁重建,可能导致卡顿和跟体验差。

我们知道,values-sw400dp,sw400dp就表明了这个value是在屏幕最短边大于等于400dp的时候生效(前提是有其他不同的value文件夹)

因此在configChanges时候,应用便会去自动寻找匹配的alues值,从而改变我们layout

在宽度变化的时候,我们的应用可能最小dp只有200dp这样,而以往我们很少适配200dp的屏幕

对于多窗口模式,宽度也是经常变化的,而在以往,我们的app宽度都是固定的,很少去适配宽度变化。

  • 多窗口下Activity生命周期注意事项
  1. Android N版本多窗口下运行的两个同时可见的Activity,只有一个处于Resumed状态,有别于华为多窗口的方案(两个可见的Activity同时处于Resumed状态)。如果是视频、社交、浏览器等类型的应用,在N版本设备多窗口下运行,建议在onStart/onStop中处理play/pause逻辑,而不要在onResume/onPause方法中处理

  2. 如何知道是否处于多窗口模式
    说明:N版本API Activity类新增inMultiWindow方法,判断当前Activity是否处于多窗口模
    式(split-screen,freeform,pip)

  3. 如何知道是否处于PiP模式
    说明:N版本API Activity类新增inPictureInPicture方法,判断当前Activity是否处于PiP模式。

  4. 如何监听是否进入多窗口模式
    说明:N版本API Activity类新增onMultiWindowModeChanged方法,监听Activity是否进入
    多窗口模式。
    注:inMultiWindow为true,则表示处于多窗口模式(split-screen,freeform,pip);否则,已退出多窗口模式。

  5. 如何监听是否进入PiP模式
    说明:N版本API Activity类新增onPictureInPictureChanged方法,监听Activity是否进入
    PiP模式。
    inPictureInPicture为true,则表示处于Pip模式;否则,已退出Pip模式。如果Activity要进入PiP模式,可通过调用 方法,使Activity自身
    进入PiP模式,前提条件是该Activity的 为true。

  • 多窗口模式中打开新的窗口处理

要在另一个窗口中打开一个Activity,接着我们只需要给这个Intent设置一个标签,完整代码如下:

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(geoLocation);
intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT);

这个时候我们再运行,调用的窗口会在另一个窗口中被打开。

  • 验证适配是否正常
    1、 全屏下启动应用,长按Recent启动多窗口,验证应用是否能正常切换到多窗口下显示。
    2、 全屏下按Recent显示最近任务列表,拖拽应用标题栏到屏幕高亮区域, 验证应用是否能正常在多窗口下显示。
    3、 拖动分割线,对窗口大小缩放,验证UI是否显示正常,功能是否能正常使用。
    4、 如果应用定义minimalSize,则验证窗口大小是否能缩放到低于minimalSize值。
    5、 性能测试,验证窗口缩放时,UI重绘是否存在性能问题。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,902评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,037评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,978评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,867评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,763评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,104评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,565评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,236评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,379评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,313评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,363评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,034评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,637评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,719评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,952评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,371评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,948评论 2 341

推荐阅读更多精彩内容