- 浏览: 2180147 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (1240)
- mac/IOS (287)
- flutter (1)
- J2EE (115)
- android基础知识 (582)
- android中级知识 (55)
- android组件(Widget)开发 (18)
- android 错误 (21)
- javascript (18)
- linux (70)
- 树莓派 (18)
- gwt/gxt (1)
- 工具(IDE)/包(jar) (18)
- web前端 (17)
- java 算法 (8)
- 其它 (5)
- chrome (7)
- 数据库 (8)
- 经济/金融 (0)
- english (2)
- HTML5 (7)
- 网络安全 (14)
- 设计欣赏/设计窗 (8)
- 汇编/C (8)
- 工具类 (4)
- 游戏 (5)
- 开发频道 (5)
- Android OpenGL (1)
- 科学 (4)
- 运维 (0)
- 好东西 (6)
- 美食 (1)
最新评论
-
liangzai_cool:
请教一下,文中,shell、C、Python三种方式控制led ...
树莓派 - MAX7219 -
jiazimo:
...
Kafka源码分析-序列5 -Producer -RecordAccumulator队列分析 -
hp321:
Windows该命令是不是需要安装什么软件才可以?我试过不行( ...
ImageIO读jpg的时候出现javax.imageio.IIOException: Unsupported Image Type -
hp321:
Chenzh_758 写道其实直接用一下代码就可以解决了:JP ...
ImageIO读jpg的时候出现javax.imageio.IIOException: Unsupported Image Type -
huanghonhpeng:
大哥你真强什么都会,研究研究。。。。小弟在这里学到了很多知识。 ...
android 浏览器
这篇文章开始, 我们来了解一下Android 7的一些新特性, 话说今年android 7预览版本来的比以往都稍早一些, 这样对于我们开发者来说算是一个好消息, 我们可以有充足的时间来看新版android的一些特性, 让我们的应用更快的支持到android 7. 前段时间android 7发送了最终预览版本, 这也表示现在的sdk已经是最终的sdk了, 所以我们从现在开始, 完全可以让应用支持到android 7了.
今天的这篇文章我们来介绍一下在android 7上最为直观的一个特性-多窗口支持, 当然也可以叫他分屏模式. 有了这个特性妈妈再也不用担心我应用间切换的烦恼了, 那什么多窗口模式呢? 其实在很多国产机器上早就已经支持多窗口了, 只不过这次android 7标准化了多窗口模式, 这对我们开发者来说, 可以算是天大的好消息. 废话那么说, 我们还没看到多窗口模式什么样呢? 下面一张图来体验一下.
让我们的应用支持多窗口模式
如何让我们的应用支持多窗口模式呢? 其实android 7是默认开启多窗口模式的, 不过如果你用低于android 7的sdk构建的应用, 会在多窗口模式下发出一个警告. 那如何让我们的应用禁用多窗口模式呢? 毕竟好多人还是不喜欢让自己的应用和别人分享屏幕的(比如QQ), 这个也很简单, 只需要在清单文件的application或者activity中添加android:resizeableActivity="false"就ok了(目测, 接下来大多数国产APP中都会有这条属性).
多窗口模式的一些配置
禁用归禁用, 但是对于我们开发者来说, 还是要继续了解一下多窗口模式的, 那接下来我们来看一下, 在多窗口模式中又会多哪些属性. 在清单文件中我们配置activity的地方, 又多了一个layout节点, 这个节点的属性不多, 主要是用来配置多窗口模式下的一些属性的. 下面我们首先来看看如何配置, 然后来说说都是什么作用:
很简单,就是多了一个layout节点, 我们来看看他的属性.
其实, 就算我们的应用要支持多窗口模式, 上面的layout节点我们也是完全可以忽略的(而且我感觉大部分情况下是要忽略的)
还是看看生命周期
其实, 多窗口本身还是很简单的, 我们最关心的还是activity在多窗口模式下的生命周期, 下面我们就用一段demo来看一下在多窗口模式下activity的生命周期.
在开始之前, 我们发现有一个回调onMultiWindowModeChanged是我们不太熟悉的, 这个回调是为了多窗口模式新增的一个, 在进入或者退出多窗口模式, 这个回调会执行, 而且, 我们还可以用过isInMultiWindowMode()方法来判断当前activity是否在多窗口模式下. 接下来, 我们来演示一下生命周期吧.
首先是进入多窗口模式(进入多窗口模式的方法是长按手机上的overview键)
从log中可以发现, 在进入多窗口模式时, 首先回调的是onMultiWindowModeChanged方法, 然后很令人沮丧的是我们的activity销毁了,并且调用了onSaveInstanceState方法, 然后activit启动, 其实就是我们activity重启了.
那退出多窗口模式呢?
首先是一个配置变化销毁的过程, 然后是一个恢复的过程, 并且回调了onMultiWindowModeChanged方法, 此时的isInMultiWindowMode是false.
继续看生命周期, 如果我们的焦点从一个activity中切换到了和它同处于多窗口模式下的另外一个activity呢?
此时当前activity会暂停, 新获取角度的activity回调onResume, 在这里官网还有一个notice, 比如我们之前是在onPause中暂停视频播放, 在这种情况下, 失去焦点后就暂停了, 显然这不是很好的用户体验, 我们需要把视频的暂停和继续放到onStop和onStart中.
启动activity
现在我们在来学习下如何在多窗口模式下启动activity. 这样分两种情况了, 一种在是当前栈中启动, 另一种是在新的栈中启动.
对于第一种情况, 很简单, 就是在当前窗口中启动新的activity, 而第二种情况, 我们可以指定在同级窗口下启动, 只需要给intent设置一个FLAG_ACTIVITY_LAUNCH_ADJACENTflag就ok.
例如下面的代码:
上面的代码我们会在另外一个窗口启动新的activity
另外, 我们还可以制定新启动的activity的大小.
跨activity拖拽
从android 4.0开始, android就已经支持activity内的内容拖拽了, 现在在多窗口模式下, android增强了拖拽功能, 另它在多窗口模式下可以在activity间实现内容的拖拽, 不过在activity间也仅限于内容的拖拽, 对view的跨activity拖拽还是不可以的. 现在我们在MainActivity和SecondActivity之前来模拟一下跨activity拖拽内容.
这里我们监听button的长按事件, 在长按事件中, 首先我们用button的文本构建一个ClipData对象. 然后调用view.startDragAndDrop方法来启动拖拽. 这里要注意一下最后一个参数View.DRAG_FLAG_GLOBAL, 这个flag表示我们可以跨activity进行拖拽.
接着我们来看看SecondActivity如何处理拖拽事件.
这里首先我们拿到根布局(这里就先不要纠结根布局到底是谁了, 这里的根布局指的是content_view的根布局), 然后给它设置OnDragListener的监听, 在ACTION_DROP时候我们通过dragEvent.getClipData().getItemAt(0)拿到拖拽的item, 然后通过getText()方法获取到内容, 并且设置到TextView上显示.
来看看效果:
ok, 到现在为止android 7的多窗口模式我们就介绍完了, 这些内容大家有点印象就可以, 毕竟在我们日常的工作中基本一个android:resizeableActivity="false"就可以了.
今天的这篇文章我们来介绍一下在android 7上最为直观的一个特性-多窗口支持, 当然也可以叫他分屏模式. 有了这个特性妈妈再也不用担心我应用间切换的烦恼了, 那什么多窗口模式呢? 其实在很多国产机器上早就已经支持多窗口了, 只不过这次android 7标准化了多窗口模式, 这对我们开发者来说, 可以算是天大的好消息. 废话那么说, 我们还没看到多窗口模式什么样呢? 下面一张图来体验一下.
让我们的应用支持多窗口模式
如何让我们的应用支持多窗口模式呢? 其实android 7是默认开启多窗口模式的, 不过如果你用低于android 7的sdk构建的应用, 会在多窗口模式下发出一个警告. 那如何让我们的应用禁用多窗口模式呢? 毕竟好多人还是不喜欢让自己的应用和别人分享屏幕的(比如QQ), 这个也很简单, 只需要在清单文件的application或者activity中添加android:resizeableActivity="false"就ok了(目测, 接下来大多数国产APP中都会有这条属性).
多窗口模式的一些配置
禁用归禁用, 但是对于我们开发者来说, 还是要继续了解一下多窗口模式的, 那接下来我们来看一下, 在多窗口模式中又会多哪些属性. 在清单文件中我们配置activity的地方, 又多了一个layout节点, 这个节点的属性不多, 主要是用来配置多窗口模式下的一些属性的. 下面我们首先来看看如何配置, 然后来说说都是什么作用:
<activity android:name=".MyActivity"> <layout android:defaultHeight="500dp" android:defaultWidth="500dp" android:gravity="bottom|end" android:minimalHeight="200dp" android:minimalWidth="200dp" /> </activity>
很简单,就是多了一个layout节点, 我们来看看他的属性.
- android:defaultHeight 这条是配置多窗口模式下默认的高度.
- android:defaultWidth 这条是配置多窗口模式下默认的宽度.
- android:gravity 这条是配置多窗口模式下activity的初始位置. (注意:这条语句在我测试过程中发现貌似没起到作用)
- android:minimalHeight 这条是配置多窗口模式下最小的高度. (注意:这条语句在我测试过程中发现配置后直接编译不了)
- android:minimalWidth 这条是配置多窗口模式下最小的宽度. (注意:这条语句在我测试过程中发现配置后直接编译不了)
其实, 就算我们的应用要支持多窗口模式, 上面的layout节点我们也是完全可以忽略的(而且我感觉大部分情况下是要忽略的)
还是看看生命周期
其实, 多窗口本身还是很简单的, 我们最关心的还是activity在多窗口模式下的生命周期, 下面我们就用一段demo来看一下在多窗口模式下activity的生命周期.
@Override protected void onCreate(Bundle savedInstanceState) { prntLog("onCreate"); } @Override protected void onStart() { prntLog("onStart"); super.onStart(); } @Override protected void onResume() { prntLog("onResume"); super.onResume(); } @Override protected void onPause() { prntLog("onPause"); super.onPause(); } @Override protected void onStop() { prntLog("onStop"); super.onStop(); } @Override protected void onDestroy() { prntLog("onDestory"); super.onDestroy(); } @Override protected void onSaveInstanceState(Bundle outState) { prntLog("onSaveInstanceState"); super.onSaveInstanceState(outState); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { prntLog("onRestoreInstanceState"); super.onRestoreInstanceState(savedInstanceState); } @Override public void onMultiWindowModeChanged(boolean isInMultiWindowMode) { prntLog("onMultiWindowModeChanged:" + isInMultiWindowMode); prntLog("isInMultiWindowMode:" + isInMultiWindowMode()); super.onMultiWindowModeChanged(isInMultiWindowMode); } private void prntLog(String log) { Log.d("MainActivity", log); }
在开始之前, 我们发现有一个回调onMultiWindowModeChanged是我们不太熟悉的, 这个回调是为了多窗口模式新增的一个, 在进入或者退出多窗口模式, 这个回调会执行, 而且, 我们还可以用过isInMultiWindowMode()方法来判断当前activity是否在多窗口模式下. 接下来, 我们来演示一下生命周期吧.
首先是进入多窗口模式(进入多窗口模式的方法是长按手机上的overview键)
D/MainActivity: onMultiWindowModeChanged:true D/MainActivity: isInMultiWindowMode:true D/MainActivity: onPause D/MainActivity: onSaveInstanceState D/MainActivity: onStop D/MainActivity: onDestory D/MainActivity: onCreate D/MainActivity: onStart D/MainActivity: onRestoreInstanceState D/MainActivity: onResume D/MainActivity: onPause
从log中可以发现, 在进入多窗口模式时, 首先回调的是onMultiWindowModeChanged方法, 然后很令人沮丧的是我们的activity销毁了,并且调用了onSaveInstanceState方法, 然后activit启动, 其实就是我们activity重启了.
那退出多窗口模式呢?
D/MainActivity: onSaveInstanceState D/MainActivity: onStop D/MainActivity: onDestory D/MainActivity: onCreate D/MainActivity: onStart D/MainActivity: onRestoreInstanceState D/MainActivity: onResume D/MainActivity: onPause D/MainActivity: onMultiWindowModeChanged:false D/MainActivity: isInMultiWindowMode:false D/MainActivity: onResume
首先是一个配置变化销毁的过程, 然后是一个恢复的过程, 并且回调了onMultiWindowModeChanged方法, 此时的isInMultiWindowMode是false.
继续看生命周期, 如果我们的焦点从一个activity中切换到了和它同处于多窗口模式下的另外一个activity呢?
D/MainActivity: onPause D/SecondActivity: onResume
此时当前activity会暂停, 新获取角度的activity回调onResume, 在这里官网还有一个notice, 比如我们之前是在onPause中暂停视频播放, 在这种情况下, 失去焦点后就暂停了, 显然这不是很好的用户体验, 我们需要把视频的暂停和继续放到onStop和onStart中.
启动activity
现在我们在来学习下如何在多窗口模式下启动activity. 这样分两种情况了, 一种在是当前栈中启动, 另一种是在新的栈中启动.
对于第一种情况, 很简单, 就是在当前窗口中启动新的activity, 而第二种情况, 我们可以指定在同级窗口下启动, 只需要给intent设置一个FLAG_ACTIVITY_LAUNCH_ADJACENTflag就ok.
例如下面的代码:
Intent intent = new Intent(this, SecondActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT|Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent);
上面的代码我们会在另外一个窗口启动新的activity
另外, 我们还可以制定新启动的activity的大小.
Rect bounds = new Rect(500, 300, 100, 0); ActivityOptions options = ActivityOptions.makeBasic(); options.setLaunchBounds(bounds); Intent intent = new Intent(this, SecondActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT|Intent.FLAG_ACTIVITY_NEW_TASK); ActivityCompat.startActivity(this, intent, options.toBundle());
跨activity拖拽
从android 4.0开始, android就已经支持activity内的内容拖拽了, 现在在多窗口模式下, android增强了拖拽功能, 另它在多窗口模式下可以在activity间实现内容的拖拽, 不过在activity间也仅限于内容的拖拽, 对view的跨activity拖拽还是不可以的. 现在我们在MainActivity和SecondActivity之前来模拟一下跨activity拖拽内容.
// MainActivity Button view = (Button) findViewById(R.id.button); view.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View view) { ClipData data = ClipData.newPlainText(view.getClass().getName(), ((Button) view).getText()); View.DragShadowBuilder builder = new View.DragShadowBuilder(view); view.startDragAndDrop(data, builder, view, View.DRAG_FLAG_GLOBAL); return true; } });
这里我们监听button的长按事件, 在长按事件中, 首先我们用button的文本构建一个ClipData对象. 然后调用view.startDragAndDrop方法来启动拖拽. 这里要注意一下最后一个参数View.DRAG_FLAG_GLOBAL, 这个flag表示我们可以跨activity进行拖拽.
接着我们来看看SecondActivity如何处理拖拽事件.
final TextView content = (TextView) findViewById(R.id.content); findViewById(R.id.container).setOnDragListener(new View.OnDragListener() { @Override public boolean onDrag(View view, DragEvent dragEvent) { switch (dragEvent.getAction()) { case DragEvent.ACTION_DRAG_STARTED: prntLog("drag started"); break; case DragEvent.ACTION_DRAG_ENTERED: prntLog("drag entered"); break; case DragEvent.ACTION_DROP: ClipData.Item item = dragEvent.getClipData().getItemAt(0); content.setText(item.getText()); break; case DragEvent.ACTION_DRAG_ENDED: prntLog("drag entered"); break; } return true; } });
这里首先我们拿到根布局(这里就先不要纠结根布局到底是谁了, 这里的根布局指的是content_view的根布局), 然后给它设置OnDragListener的监听, 在ACTION_DROP时候我们通过dragEvent.getClipData().getItemAt(0)拿到拖拽的item, 然后通过getText()方法获取到内容, 并且设置到TextView上显示.
来看看效果:
ok, 到现在为止android 7的多窗口模式我们就介绍完了, 这些内容大家有点印象就可以, 毕竟在我们日常的工作中基本一个android:resizeableActivity="false"就可以了.
发表评论
-
带你深入理解 FLUTTER 中的字体“冷”知识
2020-08-10 23:40 612本篇将带你深入理解 Flutter 开发过程中关于字体和文 ... -
Flutter -自定义日历组件
2020-03-01 17:56 1087颜色文件和屏幕适配的文件 可以自己给定 import ... -
Dart高级(一)——泛型与Json To Bean
2020-02-23 19:13 976从 Flutter 发布到现在, 越来越多人开始尝试使用 Da ... -
flutter loading、Progress进度条
2020-02-21 17:03 1132Flutter Progress 1 条形无固定值进度条 ... -
Flutter使用Https加载图片
2020-02-21 01:39 983Flutter使用Https加载图片 使用http加载图片出 ... -
flutter shared_preferences 异步变同步
2020-02-21 00:55 827前言 引用 在开发原生iOS或Native应用时,一般有判断上 ... -
Flutter TextField边框颜色
2020-02-19 21:31 911监听要销毁 myController.dispose(); T ... -
flutter Future的正确用法
2020-02-18 21:55 787在flutter中经常会用到异步任务,dart中异步任务异步处 ... -
记一次Flutter简单粗暴处理HTTPS证书检验方法
2020-02-18 14:13 921最近在做Flutter项目到了遇到一个无解的事情,当使用Ima ... -
flutter 获取屏幕宽度高度 通知栏高度等屏幕信息
2019-07-27 08:39 1305##MediaQuery MediaQuery.of(con ... -
关于flutter RefreshIndicator扩展listview下拉刷新的问题
2019-07-10 19:40 1058当条目过少时listview某些嵌套情况下可能不会滚动(条目 ... -
flutter listview 改变状态的时候一直无限添加
2019-07-10 16:01 721setstate的时候会一直无限的调用listview.bui ... -
Flutter Android端启动白屏问题的解决
2019-07-09 00:51 1476问题描述 Flutter 应用在 Android 端上启动时 ... -
Flutter中SnackBar使用
2019-07-08 23:43 742底部弹出,然后在指定时间后消失。 注意: build(Bui ... -
Flutter 之点击空白区域收起键盘
2019-07-08 18:43 1758点击空白处取消TextField焦点这个需求是非常简单的,在学 ... -
Flutter 弹窗 Dialog ,AlertDialog,IOS风格
2019-07-08 18:04 1349import 'package:flutter/mate ... -
flutter ---TextField 之 输入类型、长度限制
2019-07-08 14:30 2288TextField想要实现输入类型、长度限制需要先引入impo ... -
【flutter 溢出BUG】键盘上显示bottom overflowed by 104 PIXELS
2019-07-08 11:13 1516一开始直接使用Scaffold布局,body:new Colu ... -
解决Flutter项目卡在Initializing gradle...界面的问题
2019-07-07 12:53 842Flutter最近很火,我抽出了一点时间对Flutter进行了 ... -
关于android O 上 NotificationChannel 的一些注意事项
2019-07-04 11:47 921最近在适配android O,遇到个问题,应用中原本有设置界面 ...
相关推荐
在Android平台上实现视频聊天功能,特别是涉及到大小窗口切换时,涉及到多个关键技术和组件。下面将详细阐述这个过程中的核心知识点。 一、视频采集与编码 1. Camera API:Android提供了Camera API来访问设备的...
首先,我们来了解一下弹出窗口的基本概念。在Android中,弹出窗口通常分为两种类型:AlertDialog和PopupWindow。AlertDialog是系统提供的标准对话框,它提供了固定的样式和行为,而PopupWindow则更为灵活,允许...
如标题所述,“Android窗口化App位移强制移动window窗口”,这可以通过在`PhoneWindowManager`中强制指定window的显示区域来实现。例如: ```java // 在PhoneWindowManager中指定新的显示区域 w.mFrame.left = newX...
6. **多窗口支持**:StandOut允许同时存在多个浮动窗口,用户可以切换或管理这些窗口,提高多任务处理能力。 7. **权限控制**:在Android系统中,浮动窗口需要特定的权限才能运行。StandOut框架处理了这些权限请求...
通过这个实例,新手可以了解到Android小窗口部件的基本结构、`AppWidgetProvider`的工作方式以及如何与主屏幕交互。同时,对于更高级的开发者,这也可以作为一个起点,进一步探索如何添加更复杂的功能,如自定义动画...
1. 多窗口支持:Android 7引入了多窗口模式,允许用户同时运行两个应用,极大地提升了工作效率。开发者需要学习如何优化应用以适应这种新交互模式,确保应用在多窗口环境下正常运行。 2. 数据节省模式:为了帮助...
1. 多窗口支持:Android 7引入了多窗口模式,允许用户同时运行两个应用,提升了设备的生产力。开发者需要考虑如何调整UI和交互设计以适应这种新的显示模式。 2. 数据节省模式:系统提供了一种机制,允许用户限制...
在Android开发中,创建一个支持全屏和小窗口播放切换的视频播放器是常见的需求,特别是在构建媒体应用或者社交应用时。"NiceVieoPlayer"是一个专为此目的设计的开源项目,它允许用户在全屏模式和悬浮小窗口模式之间...
综上所述,《Android-A Programmer's Guide》不仅是一本针对初学者的指南,也是深入了解Android开发基础知识的重要资源。通过本书的学习,开发者不仅能够掌握创建基本Android应用程序的方法,还能为后续更复杂的应用...
4. **多窗口模式**:Android 7引入了分屏多窗口模式,DeckView在此模式下能适配不同比例的屏幕,让两个应用同时显示在屏幕上。 为了实现这些功能,开发者需要熟悉Android的视图系统,包括ViewGroup、Adapter和...
在Android开发中,有时我们需要创建可以拖动的视图,比如浮动窗口或者可移动的控件,这时就涉及到了`ViewDragHelper`的使用。`ViewDragHelper`是Android SDK提供的一种工具类,用于帮助开发者处理View的拖放操作,它...
- **多窗口模式**:Android 7首次引入了多窗口支持,允许应用在分屏模式下同时显示两个应用。 - **通知增强**:引入了直接回复功能,用户可以直接在通知栏对消息进行回复,无需打开应用。 - **Doze模式**:优化了...
【Android浮动窗口播放器】是一种在Android操作系统上实现的创新性功能,允许用户在主屏幕或其他应用程序之上...通过分析和学习这个源码,你可以深入了解Android系统的运作机制,并为未来的工作或项目积累宝贵经验。
4. 其他新特性:包括多用户支持、通知改进、多窗口模式、蓝牙低功耗(BLE)API的增强等,都为开发者提供了更多可能性。源码研究可以帮助开发者更好地利用这些功能,创建更丰富、更高效的应用。 5. 性能优化:...
在Android开发中,实现视频浮动窗口(也称为悬浮小窗口或Picture-in-Picture模式)是一项高级功能,它允许用户在...通过研究这个源码,开发者不仅可以学到如何实现视频浮动窗口,还能了解Android应用开发的最佳实践。
通过上述知识点的梳理,我们可以了解到在Android系统中实现监听系统来电并弹出提示窗口涉及到的权限申请、广播接收器的使用、状态监听、网络请求、悬浮窗口的创建等多方面的技术和细节。这些内容共同构成了一个完整...
在Android开发中,实现视频浮动窗口(也称为悬浮小窗口或Picture-in-Picture模式)是一项高级功能,可以增强用户体验,特别是在多任务处理时。这个"Android 视频浮动窗口源码"压缩包提供了相关的源代码示例,帮助...
通过对该日志文件的分析,我们可以了解到 Android 系统启动过程中的一些关键事件和遇到的问题,特别是与文件系统和图形处理相关的部分。这些信息对于排除故障、优化系统性能以及进行进一步的调试工作都至关重要。
- 多线程编程:在Android上,Qt应用可能需要处理多线程来提高性能或实现后台任务。 - 数据持久化:使用SQLite数据库存储应用程序数据。 - 网络通信:使用Qt的网络模块进行HTTP请求、WebSocket通信等。 - 图像和...