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. [BJOI2006]狼抓兔子

    题目描述 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: ...

  2. bzoj 1974: [Sdoi2010]代码拍卖会

    Description 随着iPig在P++语言上的造诣日益提升,他形成了自己一套完整的代 码库.猪王国想参加POI的童鞋们都争先恐后问iPig索要代码库.iPi g不想把代码库给所有想要的小猪,只想 ...

  3. VS2012代码对齐快捷键

    1.选中想要对齐的代码 2.全选代码后按住Ctrl+K,Ctrl+F键,就可以了

  4. C语言程序设计第二次作业——

    1,编译过程过程中的错误缺引号和分号并且拼写错误. 正确结果: 2,编译过程 改正错误: 正确结果: 3,利用SIZEOF运算符求出的数据类型所占字节大小: 4,在头文件LIMITS.H中相关的编译 ...

  5. Tensorflow 基于分层注意网络的文件分类器

    After the exercise of building convolutional, RNN, sentence level attention RNN, finally I have come ...

  6. 阿里2019实习内推,五轮技术面+一轮HR面,Java岗面经

    在牛客网上获取到很多知识和信息,现在反馈一波,希望能对广大找实习的同学有所帮助. 个人情况:EE方向渣硕,二月末内推了阿里集团某部门Java岗,约三周完成了所有面试. 面经如下: 一面 (简历评估): ...

  7. 原生js移动端列表无缝间歇向上滚动

    在项目开发中尤其是在项目的活动页面的开发中,经常需要将用户的购买信息或中奖信息等以列表的形式展示在页面当中,并可以使其自动间歇向上滚动来达到在有限的区域内展示所有信息的目的.通常的做法是通过将列表父元 ...

  8. 【集合框架】JDK1.8源码分析之HashMap(一) 转载

    [集合框架]JDK1.8源码分析之HashMap(一)   一.前言 在分析jdk1.8后的HashMap源码时,发现网上好多分析都是基于之前的jdk,而Java8的HashMap对之前做了较大的优化 ...

  9. MySQL查看数据库信息

    使用MySQL时,需要了解当前数据库的情况,例如当前的数据库大小.字符集.用户等等.下面总结了一些查看数据库相关信息的命令 1:查看显示所有数据库 mysql> show databases; ...

  10. PHP 5 MySQLi 函数

    在 PHP 中使用 MySQLi 函数需要注意的是:你需要添加对 MySQLi 扩展的支持. PHP MySQLi 简介 PHP MySQLi = PHP MySQL Improved! MySQLi ...