Android7.0 多窗口你值得拥有
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 的默认大小、位置和最小尺寸:
不同的配置下,效果会不一样
- 如何设置禁止分屏.
在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="" />
- 设置以最小尺寸方式开启分屏
在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>
- AndroidManifest 配置Configuration的参数会有什影响?
activity中AndroidManifest 配置Configuration的参数,会影响到分屏.
- 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的横竖屏会影响它的生命周期,那么对于多窗口来说,是否也会有这样的影响呢?
在多窗口模式中,在指定时间只有最近与用户交互过的 Activity 为活动状态。 该 Activity 将被视为顶级 Activity。 所有其他 Activity 虽然可见,但均处于暂停状态。 但是,这些已暂停但可见的 Activity 在系统中享有比不可见 Activity 更高的优先级。 如果用户与其中一个暂停的 Activity 交互,该 Activity 将恢复,而之前的顶级 Activity 将暂停。
注:在多窗口模式中,用户仍可以看到处于暂停状态的应用。 应用在暂停状态下可能仍需要继续其操作。 例如,处于暂停模式但可见的视频播放应用应继续显示视频。 因此,我们建议播放视频的 Activity 不要暂停其 onPause() 处理程序中的视频。 应暂停 onStop() 中的视频,并恢复onStart() 中的视频播放。
也就是说多窗口模式不会更改Activity的生命周期,但是在对一些需要使用到onPause()方法的为了更好体验,需要做小变动.
Android7.0 多窗口你值得拥有的更多相关文章
- WmS简介(三)之Activity窗口是如何创建的?基于Android7.0源码
OK,在前面两篇博客中我们分别介绍了WmS中的token,同时也向小伙伴们区分了Window和窗口的区别,并且按照type值的不同将Android系统中的窗口分为了三大类,那么本篇博客我们就来看看应用 ...
- WmS详解(二)之如何理解Window和窗口的关系?基于Android7.0源码
上篇博客(WmS详解(一)之token到底是什么?基于Android7.0源码)中我们简要介绍了token的作用,这里涉及到的概念非常多,其中出现频率最高的要数Window和窗口这一对搭档了,那么我们 ...
- 【转】Android7.0适配心得
本文出自:贾鹏辉的技术博客(http://www.devio.org) http://www.devio.org/2016/09/28/Android7.0%E9%80%82%E9%85%8D%E5% ...
- 【转】Android7.0版本以上的手机Eclipse无法打出LogCat
本来想用Eclipse连下手机看下log的,结果LogCat没打出来任何信息,起初怀疑是我的DDMS有问题,结果连了下我老大的手机,完美打出log,看了下Android系统,老大的是6.0的,我的7. ...
- fir.im Weekly - 关于 Log Guru 开源、Xcode 探索和 Android7.0 适配
本期 fir.im Weekly 整理了最近的一些技术分享,包括关于 Log Guru 开源.Xcode 探索. Android7.0 适配等等 iOS/Android 相关的工具.源码分享和技术文章 ...
- Android7.0 Phone应用源码分析(二) phone来电流程分析
接上篇博文:Android7.0 Phone应用源码分析(一) phone拨号流程分析 今天我们再来分析下Android7.0 的phone的来电流程 1.1TelephonyFramework 当有 ...
- Android7.0 Phone应用源码分析(一) phone拨号流程分析
1.1 dialer拨号 拨号盘点击拨号DialpadFragment的onClick方法会被调用 public void onClick(View view) { int resId = view. ...
- Android7.0 Phone应用源码分析(三) phone拒接流程分析
本文主要分析Android拒接电话的流程,下面先来看一下拒接电话流程时序图 步骤1:滑动按钮到拒接图标,会调用到AnswerFragment的onDecline方法 com.android.incal ...
- Android7.0 Phone应用源码分析(四) phone挂断流程分析
电话挂断分为本地挂断和远程挂断,下面我们就针对这两种情况各做分析 先来看下本地挂断电话的时序图: 步骤1:点击通话界面的挂断按钮,会调用到CallCardPresenter的endCallClicke ...
随机推荐
- [HAOI 2006]受欢迎的牛
Description 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎. 这种关系是具有传递性的,如果A认为B受欢迎,B认为C受欢迎,那么牛A也认 ...
- [BZOJ1977]严格次小生成树
[问题描述] 小C最近学了很多最小生成树的算法,Prim算法.Kurskal算法.消圈算法等等. 正当小C洋洋得意之时,小P又来泼小C冷水了.小P说,让小C求出一个无向图的次小生成树,而且这个次小生成 ...
- 洛谷P3168 [CQOI2015]任务查询系统
#include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> #in ...
- HDU 5506(GT and set)
题意: 表示看了很久,然而发现还是没看懂题. 正解:给你a个集合,让你把他们合并成k个,当两个集合有公共数字时可以合并. (一直以为是合并后,每个集合至少有两个数字相同- -,这英语也是醉了) 思路: ...
- bzoj3437小P的牧场 斜率优化dp
3437: 小P的牧场 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1542 Solved: 849[Submit][Status][Discus ...
- java HTTP请求工具
package HttpRequestTest; import java.io.BufferedReader; import java.io.InputStream; import java.io.I ...
- 【集合框架】JDK1.8源码分析之HashMap(一) 转载
[集合框架]JDK1.8源码分析之HashMap(一) 一.前言 在分析jdk1.8后的HashMap源码时,发现网上好多分析都是基于之前的jdk,而Java8的HashMap对之前做了较大的优化 ...
- eclipse中创建完整的maven项目
使用eclipse插件创建一个web project 首先创建一个Maven的Project如下图 我们勾选上Create a simple project (不使用骨架) 这里的Packing 选择 ...
- ABP文档笔记 - 通知
基础概念 两种通知发送方式 直接发送给目标用户 用户订阅某类通知,发送这类通知时直接分发给它们. 两种通知类型 一般通知:任意的通知类型 "如果一个用户发送一个好友请求,那么通知我" ...
- 剑指架构师系列-spring boot的logback日志记录
Spring Boot集成了Logback日志系统. Logback的核心对象主要有3个:Logger.Appender.Layout 1.Logback Logger:日志的记录器 主要用于存放日志 ...