Android7.0新特性介绍(一)——多窗口支持

#Android7.0新特性
关于Android7.0介绍最权威的当然是https://developer.android.com/about/versions/nougat/android-7.0.html啦。略一翻看,发现新东西还蛮多。为了简明扼要,我只整理了手机平板相关的(不包括AndroidTV)。

#1 多窗口支持 (在手机和平板中叫分屏模式,最多就俩窗口)
在 Android N 中,Google引入了一个新的而且非常需要的多任务处理功能 — 多窗口支持

##1.1 进入多窗口模式

  • 启动App,长按系统导航栏右下角的小方块(Google官方把这个叫做Overview Button),确保你的App可以进入分屏模式,且尺寸改变后仍然能正常工作。
  • 启动任务管理器(即单击右下角的小方块),然后长按你App的标题栏,将它拖动到屏幕上的高亮区域。确保你的App可以进入分屏模式,且尺寸改变后仍然能正常工作。
    ##1.2 多窗口生命周期
    多窗口模式不会更改 Activity 生命周期。

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

##1.3 针对多窗口模式配置应用
如果您的应用面向 Android N,您可以对应用的 Activity 是否支持多窗口显示以及显示方式进行配置。 您可以在清单文件中设置属性,以控制大小和布局。 根 Activity 的属性设置适用于其任务栈中的所有 Activity。 例如,如果根 Activity 已 android:resizeableActivity 设定为 true,则任务栈中的所有 Activity 都将可以调整大小。

注:如果您使用低于 Android N 版本的 SDK 构建多向应用,则用户在多窗口模式中使用应用时,系统将强制调整应用大小。 系统将显示对话框,提醒用户应用可能会发生异常。 系统不会调整定向应用的大小;如果用户尝试在多窗口模式下打开定向应用,应用将全屏显示。

  • android:resizeableActivity
    在清单的 或 节点中设置该属性,启用或禁用多窗口显示:
    android:resizeableActivity=["true" | "false"]
    如果该属性设置为 true,Activity 将能以分屏和自由形状模式启动。 如果此属性设置为 false,Activity 将不支持多窗口模式。 如果该值为 false,且用户尝试在多窗口模式下启动 Activity,该 Activity 将全屏显示。

如果您的应用面向 Android N,但未对该属性指定值,则该属性的值默认设为 true。

注:近期(约2016/10/19)我的Nexus6P收到了一个Android7.0的补丁,安装补丁后,系统会尝试使任何App进入多窗口模式,无论设置resizeableActivity与否。
##1.4 在多窗口模式中运行应用
Android N 添加了新功能,以支持可在多窗口模式中运行的应用。
###1.4.1 多窗口模式中被禁用的功能
在设备处于多窗口模式中时,某些功能会被禁用或忽略,因为这些功能对与其他 Activity 或应用共享设备屏幕的 Activity 而言没有意义。 此类功能包括:

  • 某些系统 UI 自定义选项将被禁用;例如,在非全屏模式中,应用无法隐藏状态栏。
  • 系统将忽略对 android:screenOrientation 属性所作的更改。
    ###1.4.2 多窗口变更通知和查询
  • boolean Activity.isInMultiWindowMode()
    调用该方法以确认Activity是否处于多窗口模式
  • Activity.onMultiWindowModeChanged()
    Activity 进入或退出多窗口模式时系统将调用此方法。 在 Activity 进入多窗口模式时,系统向该方法传递 true 值,在退出多窗口模式时,则传递 false 值。

Fragment也拥有以上方法。
##1.5 在多窗口模式种启动新的Activity
在启动新 Activity 时,用户可以提示系统如果可能,应将新 Activity 显示在当前 Activity 旁边。 要执行此操作,可使用标志 Intent.FLAG_ACTIVITY_LAUNCH_TO_ADJACENT。 传递此标志将请求以下行为:

  • 如果设备处于分屏模式,系统会尝试在启动系统的 Activity 旁创建新 Activity,这样两个 Activity 将共享屏幕。 系统并不一定能实现此操作,但如果可以,系统将使两个 Activity 处于相邻的位置。
  • 如果设备不处于分屏模式,则该标志无效。

注:如果您在任务栈中启动 Activity,该 Activity 将替换屏幕上的 Activity,并继承其所有的多窗口属性。 如果要在多窗口模式中以单独的窗口启动新 Activity,则必须在新的任务栈中启动此 Activity。

Intent intent = new Intent(MainActivity.this,SecondActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCH_TO_ADJACENT|Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

##1.6 支持拖放
用户可以在两个 Activity 共享屏幕的同时在这两个 Activity 之间拖放数据 (在此之前,用户只能在一个 Activity 内部拖放数据)。 因此,如果您的应用目前不支持拖放功能,您可以在其中添加此功能。

N Preview SDK 扩展了 android.view 软件包,以支持跨应用拖放。 有关以下类和方法的详细信息,请参阅 N Preview SDK 参考。

  • View.startDragAndDrop()
    View.startDrag() 的新别名。要启用跨 Activity 拖放,请传递新标志 View.DRAG_FLAG_GLOBAL。 如需对接收拖放数据的 Activity 授予 URI 权限,可根据情况传递新标志View.DRAG_FLAG_GLOBAL_URI_READView.DRAG_FLAG_GLOBAL_URI_WRITE

  • View.cancelDragAndDrop()
    只能由拖动发起方调用。取消当前正在进行的拖动操作。

  • View.updateDragShadow()
    只能由拖动发起方调用。给当前正在进行的拖动操作的拖动设置阴影。

  • android.view.DropPermissions
    令牌对象,负责指定对接收拖放数据的应用授予的权限。

  • Activity.requestDropPermissions()
    传递URI权限时,需要调用这个方法。传递的内容存储在DragEvent中的ClipData里。返回值为前面的android.view.DropPermissions

感谢博主Uncle Chen分享,附其详解博文:
Android N App分屏模式完全解析(上)
Android N App分屏模式完全解析(下)
##1.7 在分屏模式下测试你的App(开发人员和测试人员都需要了解)
无论您是否针对 Android N 更新应用,都应验证应用在多窗口模式下的行为,以防用户尝试在运行 Android N 的设备上以多窗口模式启动应用。

  • Android N默认支持分屏模式

  • 如果您的应用不是使用 N SDK 构建的,则用户尝试在多窗口模式中使用应用时,系统将强制调整应用大小,除非应用进行了定向声明(android:unresizeableActivity=“true”)。

  • 如果您的应用没有进行定向声明,则应在运行 Android N 的设备上启动应用,并尝试将应用切换到分屏模式。 验证并确保在强制调整应用大小时用户体验可接受。

  • 如果应用进行了定向声明,则应尝试将应用切换到多窗口模式。 验证并确保执行此操作后,应用仍保持全屏模式。(前文提及,现已失效)

###1.7.1 如果支持多窗口模式
如果您的应用是使用 N SDK 构建的,且未禁用多窗口支持,则在分屏模式下验证以下行为。

  • 在全屏模式下启动应用,然后通过长按 Overview 按钮(屏幕右下角的小方框)切换到多窗口模式。 验证并确保应用正常切换。

  • 直接在多窗口模式中启动应用,验证并确保应用正常启动。 您可以按一下 Overview 按钮,再长按应用的标题栏,并将其拖动到屏幕上任一突出显示的区域,从而在多窗口模式中启动应用。

  • 拖动分界线,在分屏模式中调整应用的大小。 验证并确保应用正常调整大小且未崩溃,并且必要的 UI 元素仍可见。

  • 完成所有测试后,验证并确保应用性能可以接受。例如,验证并确保调整应用大小后更新 UI 没有长时间的滞后。

1.7.2 测试检查单

要在多窗口模式中验证应用性能,请执行以下操作。 除非另有说明,否则请分别在分屏和多窗口模式中执行以下操作。

  • 进入和退出多窗口模式。

  • 从您的应用切换到另一个应用,验证并确保应用在非活动但可见的状态下正常运行。 例如,如果您的应用在播放视频,则验证并确保在用户与另一个应用交互时视频仍在继续播放。

  • 在分屏模式中,尝试移动分界线,放大或缩小应用。 分别在左右和上下并排显示模式中尝试这些操作。 验证并确保应用不会崩溃,主要功能可见,且调整操作不需要过长时间。

  • 快速连续执行几次调整操作。验证并确保应用不会崩溃或出现内存泄漏。 有关检查应用内存使用率的信息,请参阅查看内存使用率。

  • 在多个不同窗口配置中正常使用应用,验证并确保应用正常运行。 验证并确保文本可读,且 UI 元素大小正常,不影响交互。

###1.7.3 如果已禁用多窗口支持
如果您通过设置 android:resizableActivity=“false” 禁用了多窗口支持,则应在运行 Android N 的设备上启动应用,并尝试将应用切换到自由形状和分屏模式。 验证并确保执行此操作后,应用仍保持全屏模式。(前文提及,现已失效。不过测试时,仍可尝试。)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 7.0(API级别24)开始支持Java 8的Stream API,因此,在Android 7.0上可以直接使用Stream API来处理集合。但是需要注意的是,Stream API只能在使用Java 8编译器编译的应用中使用,如果你使用的是Android Studio自带的编译器,需要对Gradle配置进行修改,以支持Java 8。 具体来说,要在Android 7.0上使用Java 8的Stream API,需要按照以下步骤进行配置: 1. 在app的build.gradle文件中添加以下配置: ``` android { ... defaultConfig { ... jackOptions { enabled true } ... } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } } ``` 在上面的代码中,我们启用了Jack编译器,并使用sourceCompatibility和targetCompatibility指定了Java版本为1.8。 2. 在build.gradle文件中添加以下配置: ``` dependencies { ... // 用于启用Java 8的支持库 compile 'com.android.support:multidex:1.0.1' compile 'com.android.support:multidex-instrumentation:1.0.1' } ``` 在上面的代码中,我们添加了multidex和multidex-instrumentation库,用于启用Java 8的支持库。 3. 在Application类中启用MultiDex: ```java public class MyApplication extends Application { @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(this); } } ``` 在上面的代码中,我们覆写了Application类的attachBaseContext()方法,并在其中调用了MultiDex.install()方法,以启用MultiDex。 完成以上配置后,就可以在Android 7.0上使用Java 8的Stream API了。例如,我们可以使用以下代码对List<Integer>进行过滤、排序和求和: ```java List<Integer> list = Arrays.asList(1, 2, 3, 4, 5); int sum = list.stream() .filter(i -> i >= 3) .sorted() .mapToInt(Integer::intValue) .sum(); System.out.println(sum); // 输出 12 ``` 在上面的代码中,我们使用了Stream API的filter()、sorted()、mapToInt()和sum()方法,对List<Integer>进行过滤、排序和求和。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值