Android7.0 多窗口你值得拥有

  • 什么是多窗口分屏?

    多窗口分屏其实在国内并不陌生,已经有一些手机和平板搭载了“分屏多任务”和”APP窗口化”功能,但这些都是手机厂商自主定制系统中添加的功能,并非安卓原生所有,因此他们的实现方式可能会不一样,但是现在google原始开始支持,这样对厂商来说也有了标准,对体验和性能上也会比较好.

  • 多窗口解决什么问题(平板适配问题).

    一些android app没经过适配,在平板上安装,会导致布局分散,用户体验很差,现在7.0对的分屏正好也是解决这个问题.

其实Android原生6.0也有自带分屏.

其实android6.0就考虑到了这个需求,不过需要先把机子root,修改系统内的一个权限.

那么如何去激活这个隐藏的必杀技呢,看下面的步骤.

激活6.0多窗口支持操作步骤:

1. root

2. 用RE文件管理器打开system/build.prop找到ro.build.type这一行,

把=号后面的user改成userdebug,保存后重启.

3. 重启后,在系统设置进入开发者选项.

4. 找到“多窗口模式”,激活功能即可.

由于该功能属于测试阶段,运行可能会导致一些异常奔溃,

所以建议备份下资料.

在7.0版本时我们如何去实现多窗口呢?

Android N 添加了对同时显示多个应用窗口的支持。 在手持设备上,两个应用可以在分屏模式中左右并排或上下并排显示。

如果您使用 N Preview SDK 构建应用,则可以配置应用处理多窗口显示的方法。 例如,您可以指定 Activity 的最小允许尺寸。 您还可以禁用应用的多窗口显示,确保系统仅以全屏模式显示应用。

预览下效果

- 在Android N设备中,系统可以对支持分屏的应用进行,横竖分屏,中间的分割线可以放大其中一个应用,对应缩小另一个应用.

如何切换到分屏模式?

- 方法一

打开OverView 屏幕,长按 Activity 标题,则可以拖动该 Activity 至屏幕突出显示的区域,

使 Activity 进入多窗口模式.

  • 方法二

    如该应用支持分屏模式且属于显示状态情况下,不必进入OverView 屏幕,可以通过长按OverView按钮直接进入分屏.

给wm 应用配置分屏模式

在清单文件的 或 节点中设置该属性,启用或禁用多窗口显示:

//设置为true ,该activity支持分屏,默认为true
android:resizeableActivity="true"

AndroidManifest中的布局属性

对于 Android N,<layout> 清单文件元素支持以下几种属性,这些属性影响 Activity 在多窗口模式中的行为,我们先看看下面的代码.


<activity android:name=".MyActivity">
    <layout android:defaultHeight="500dp"
          android:defaultWidth="600dp"
          android:gravity="top|end"
          android:minimalSize="450dp" />
</activity>

这些布局属性会对多窗口带来什么影响呢?看看下面.

android:defaultWidth

以自由形状模式启动时 Activity 的默认宽度。

android:defaultHeight

以自由形状模式启动时 Activity 的默认高度。

android:gravity

以自由形状模式启动时 Activity 的初始位置。

android:minimalSize

分屏和自由形状模式中 Activity 的最小高度和最小宽度。 如果用户在分屏模式中移动分界线,使 Activity 尺寸低于指定的最小值,系统会将 Activity 裁剪为用户请求的尺寸。

例如,以下节点显示了如何指定 Activity 在自由形状模式中显示时 Activity 的默认大小、位置和最小尺寸:

不同的配置下,效果会不一样

    1. 如何设置禁止分屏.

      在AndroidManifest中配置UnresizableActivity的unresizable属性.

      在这添加FLAG_ACTIVITY_NEW_TASK 标签开启新的任务栈,是为了避免其继承根activity的属性,比如在根activity设置了尺寸大小的话,其不设置标签属性会被继承.
Intent intent = new Intent(this, UnresizableActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

清单xml中配置unresizable属性.

<activity
android:name="com.android.multiwindowplayground.activities.UnresizableActivity"
android:resizeableActivity="false"
android:taskAffinity="" />
    1. 设置以最小尺寸方式开启分屏

      在AndroidManifest中配置MinimumSizeActivity的默认尺寸,最小尺寸,
 startActivity(new Intent(this, MinimumSizeActivity.class));

清单xml中配置unresizable属性.

   <activity
            android:name="com.android.multiwindowplayground.activities.MinimumSizeActivity"
            android:launchMode="singleInstance"
            android:taskAffinity="">
            <layout
                android:defaultHeight="500dp"
                android:defaultWidth="750dp"
                android:gravity="top|end"
                android:minimalWidth="500dp"
                android:minimalHeight="500dp" />
        </activity>
    1. AndroidManifest 配置Configuration的参数会有什影响?

      activity中AndroidManifest 配置Configuration的参数,会影响到分屏.
<activity
        android:name=".CustomConfigurationChangeActivity"
        android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"
        android:launchMode="singleInstance"
        android:taskAffinity=""/>

如果上面配置的参数有所变化,我们可以在onConfigurationChanged()方法中监听到.

如下:

//重写Activity中的onConfigurationChanged方法
@Override
public void onConfigurationChanged(Configuration newConfig) {
if(newConfig.orientation==Configuration.ORIENTATION_PORTRAIT)   {
  //TODO 竖屏,需要处理的事情
}   

if(newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE)   {
//TODO 横屏,需要处理的事情
}   

   super.onConfigurationChanged(newConfig);
}   

注意: 可能会监听不了参数的变化,别忘记加上权限

<uses-permission Android:name="android.permission.CHANGE_CONFIGURATION"></uses-permission>

如何处理设备配置带来的运行变化

有些设备配置可能会在运行时发生变化(例如屏幕方向、键盘可用性及语言)。 发生这种变化时,Android 会重启正在运行的 Activity(先后调用 onDestroy()onCreate())。重启行为旨在通过利用与新设备配置匹配的备用资源自动重新加载您的应用,来帮助它适应新配置。

首先这个变化的过程是这样的,如果你没有在activity的属性中配置’android:configChanges=”keyboardHidden| orientation’那么默认是会走横竖屏的,也就是说会走,销毁Activity->创建Activity.

由于重启整个Activity,如果数据量比较大的情况下,用户体验会十分差(例如网络请求,复杂View的绘制,动画的渲染等),所以解决这种体验我们可以通过下面两种方式:

- 通过onSaveInstanceState()onRestoreInstanceState()保存变动前的对象.

Android 会在销毁 Activity 之前调用 onSaveInstanceState(),以便您保存有关应用状态的数据。 然后,您可以在 onCreate() 或 onRestoreInstanceState() 期间恢复 Activity 状态。

  • 通过`android:configChanges=”keyboardHidden| orientation’禁止横竖屏切换.

    阻止系统在某些配置变更期间重启 Activity,但要在配置确实发生变化时接收回调(具体回调上面有代码),这样,您就能够根据需要手动更新 Activity。

多窗口的生命周期

除了知道上面的不同的配置下,效果会不一样之外,我们是不是还要注意一个问题,我们知道Activity的横竖屏会影响它的生命周期,那么对于多窗口来说,是否也会有这样的影响呢?

下面是Goodle官方的说明.

在多窗口模式中,在指定时间只有最近与用户交互过的 Activity 为活动状态。 该 Activity 将被视为顶级 Activity。 所有其他 Activity 虽然可见,但均处于暂停状态。 但是,这些已暂停但可见的 Activity 在系统中享有比不可见 Activity 更高的优先级。 如果用户与其中一个暂停的 Activity 交互,该 Activity 将恢复,而之前的顶级 Activity 将暂停。

注:在多窗口模式中,用户仍可以看到处于暂停状态的应用。 应用在暂停状态下可能仍需要继续其操作。 例如,处于暂停模式但可见的视频播放应用应继续显示视频。 因此,我们建议播放视频的 Activity 不要暂停其 onPause() 处理程序中的视频。 应暂停 onStop() 中的视频,并恢复onStart() 中的视频播放。

也就是说多窗口模式不会更改Activity的生命周期,但是在对一些需要使用到onPause()方法的为了更好体验,需要做小变动.

更多详情

Android7.0 多窗口你值得拥有的更多相关文章

  1. WmS简介(三)之Activity窗口是如何创建的?基于Android7.0源码

    OK,在前面两篇博客中我们分别介绍了WmS中的token,同时也向小伙伴们区分了Window和窗口的区别,并且按照type值的不同将Android系统中的窗口分为了三大类,那么本篇博客我们就来看看应用 ...

  2. WmS详解(二)之如何理解Window和窗口的关系?基于Android7.0源码

    上篇博客(WmS详解(一)之token到底是什么?基于Android7.0源码)中我们简要介绍了token的作用,这里涉及到的概念非常多,其中出现频率最高的要数Window和窗口这一对搭档了,那么我们 ...

  3. 【转】Android7.0适配心得

    本文出自:贾鹏辉的技术博客(http://www.devio.org) http://www.devio.org/2016/09/28/Android7.0%E9%80%82%E9%85%8D%E5% ...

  4. 【转】Android7.0版本以上的手机Eclipse无法打出LogCat

    本来想用Eclipse连下手机看下log的,结果LogCat没打出来任何信息,起初怀疑是我的DDMS有问题,结果连了下我老大的手机,完美打出log,看了下Android系统,老大的是6.0的,我的7. ...

  5. fir.im Weekly - 关于 Log Guru 开源、Xcode 探索和 Android7.0 适配

    本期 fir.im Weekly 整理了最近的一些技术分享,包括关于 Log Guru 开源.Xcode 探索. Android7.0 适配等等 iOS/Android 相关的工具.源码分享和技术文章 ...

  6. Android7.0 Phone应用源码分析(二) phone来电流程分析

    接上篇博文:Android7.0 Phone应用源码分析(一) phone拨号流程分析 今天我们再来分析下Android7.0 的phone的来电流程 1.1TelephonyFramework 当有 ...

  7. Android7.0 Phone应用源码分析(一) phone拨号流程分析

    1.1 dialer拨号 拨号盘点击拨号DialpadFragment的onClick方法会被调用 public void onClick(View view) { int resId = view. ...

  8. Android7.0 Phone应用源码分析(三) phone拒接流程分析

    本文主要分析Android拒接电话的流程,下面先来看一下拒接电话流程时序图 步骤1:滑动按钮到拒接图标,会调用到AnswerFragment的onDecline方法 com.android.incal ...

  9. Android7.0 Phone应用源码分析(四) phone挂断流程分析

    电话挂断分为本地挂断和远程挂断,下面我们就针对这两种情况各做分析 先来看下本地挂断电话的时序图: 步骤1:点击通话界面的挂断按钮,会调用到CallCardPresenter的endCallClicke ...

随机推荐

  1. [HNOI2009]通往城堡之路

    题目描述 听说公主被关押在城堡里,彭大侠下定决心:不管一路上有多少坎坷,不管城堡中的看守有多少厉害,不管救了公主之后公主会不会再被抓走,不管公主是否漂亮.是否会钟情于自己,他将义无反顾地朝着城堡前进. ...

  2. ●BZOJ 1096 [ZJOI2007]仓库建设

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1096 题解: 斜率优化DP $(d_i:i 位置到1位置的距离,p_i:i位置的成品数量,c ...

  3. hdu 5428

    题意:一个数是这n个数的乘,找出它一个不是素数的最小因子 求出所有数的所有质因子中最小的两个,相乘就是答案.如果所有数字的质因子个数不到两个,那么就是无解. #include<iostream& ...

  4. [Apio2009][bzoj1179]Atm

    题意:一个n个点m条单向边的图,每个点有权值,给定出发点和p个可以停止的点,你可以随便走一条路径从出发点走到一个可以停止的点,但是每个点的点权只能计算一次,求能得到的最大权值. n,m<=500 ...

  5. Windows下使用notepad++对文本进行行列转换

    行转列: Ctrl + F  选择替换 查找目标:填写指定的内容 替换为:\r\n 查找模式:正则表达式 单击替换或全部替换按钮 列转行: Ctrl + F  选择替换 查找目标:\r\n 替换为:不 ...

  6. html5应用程序缓存

    缓存概念: ------页面缓存: html.JS.CSS等,这些缓存资源是由于浏览器的行为而产生; ------数据缓存 ----------AppCache:  Cache Manifest 操作 ...

  7. 干货满满,腾讯云+社区技术沙龙 Kafka Meetup 深圳站圆满结束

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 云+导语:4月22日,由腾讯云和 Kafka 社区主办.开源中国协办的腾讯云+社区技术沙龙 Kafka Meetup 深圳站在腾讯大厦举行, ...

  8. Socket.io应用之联网拖拽游戏

    服务器端代码: const express=require('express'); const http=require('http'); const sio=require('socket.io') ...

  9. Appium--swipe滑动方法

    最近公司要求对APP模块自动化,以Android 自动化为例,把appium滑动的方法swipe()再小结下.滑动的目的,一方面是为了更好的查找元素,一方面就是为了滑屏操作.代码如下: package ...

  10. 02_版本控制工具SVN

    SubVersion: 安装:根据电脑版本选择安装64或32位的subversion,尽量不要选择中文或者有空格的目录安装 版本控制仓库: 创建命令:SVNadmin create 目录 启动SVN服 ...