android 浏览器 多窗口显示,Android浏览器图形侧多窗口方案

Android平台浏览器当前多窗口方案为多个浏览器子窗口公用一个图形buffer,窗口的z序和显示控制由浏览器进程维护,图形侧只能看到一个窗口。该方案能基本实现浏览器多窗口的大部分需求。但无法实现linux机顶盒中存在的部分窗口交叉的业务场景,即在浏览器多个窗口间交叉存在其他应用窗口(图1)。

4设计思路

4.1Android和其他系统(Qt/Windows)窗口概念的差异

1.进程、窗口、生命周期

在windows和linux系统中,在程序启动之后,排除意外情况,程序的退出基本由程序自己控制,期间没有什么状态切换。(不考虑资源阻塞和内核调度,这些对应用程序基本是透明的)

Android的一个应用在底层也是linux的一个进程,但在上层弱化了进程的概念,抽象出了Activity这样一种交互。代码直接控制的是Activity,用户的交互也是Activity。

Activity是从用户交互的角度抽象出来的一个对象,在概念和使用上和进程相隔离。进程类似一个收养的功能,一个进程可以有多个Activity,不仅可以收养自己当前应用的Activity,也可以收养其他安装包指定给该进程的Activity,Activity销毁了,进程并不销毁(除非系统需要或代码强制杀死进程)。

可以简单理解为,在win/linux中,一个进程有多个窗口,用户和每个window进行交互,在Android中,用户“跳过”进程,直接和窗口Activity交互,

Android对Activity提出了生命周期的概念,下面是摘抄自google sdk的描述

2.Activity生命周期的主要影响

1.系统侧:内存低时,会杀掉非active的Activity(即:不在最上层的Activity)

2.应用侧:当应用程序在非active状态时,可以释放部分资源和停止部分操作来降低CPU和内存的使用。(如浏览器非active时执行gc,停止网络,停止webkit的内核时钟…)

3.父子窗口间的通讯

在Win/Qt中,一个进程可以有多个窗口,在进程中,通过窗口句柄,可以完成对窗口内容的绘制。

Android中,Activity之间并不存在窗口句柄的概念,Activity之间不是父子的关系,是兄弟的关系。两个Activity之间只能在开启Activity时通过入参传递内容,在Activity启动之后,通过IPC(broadcast、content provider,binder…)完成数据交互,类似两个进程间通讯,在同一个进程的多个Activity对象也可以通过同一个Application对象进行数据交互。

4.2其他系统Qt/Windows多窗口及z序的实现

Qt中多窗口的实现:

BrowserMainWindow *browser = new BrowserMainWindow();

//向图形申请新窗口,返回窗口句柄

……

browser->show();//通过句柄直接操作该窗口

原始Qt中的z序

在Qt中所有窗口由窗口管理器进行管理,来实现Z序及按键派发。但不支持函数接口设置窗口的z序。窗口的z序为窗口启动的顺序。

窗口焦点属性(focusable/unfocusable)已提供接口,由应用程序设置widget属性来控制窗口是否可接受按键消息。

z序的主要修改

1.提供接口设置窗口的z序,实现混屏操作,将窗口显示出来

2.选择正确的焦点窗口,将用户事件(鼠标、键盘)派发到该窗口

4.3Android 多activity和已有 z序

Android开启activity使用系统startActivity函数,函数声明如下

public void startActivity (Intent intent)

使用方法:

startActivity (new Intent(BrowserActivity.ACTION_RESTART, null, getActivity(), BrowserActivity.class));

Android中已有的z序

Android中activity的Z序并不直接由Activity和WindowManagerService(后文简写为WMS)进行交互,而是由ActivityManagerService (后文简写为AMS) 来触发管理。当用户在某个Activity交互过程中请求另一个Activity时,当前Activity会向AMS发起请求,由AMS对请求进行解析、处理,之后启动新的Activity,在新Activity启动流程中,会attach到WindowManagerService中,完成窗口的显示。在新旧窗口的更换过程中,AMS会负责改变2个Activity的状态。

在Android中的Activity的交互请求都是直接和AMS进行交互,窗口的操作是附属在AMS管理的流程中。

4.4Android浏览器图形侧多窗口方案

方案一

Android使用多activity实现浏览器的多窗口主要有以下困难:

1.得不到窗口的句柄,不易于操作数据。(浏览器)

2.在窗口切换时存在生命周期的切换 (浏览器)

已上问题导致了,浏览器通过多Activity实现多窗口在数据的管理和状态的控制上均是比较困难的。

方案二

在Android中,提供了一种创建临时窗口的方法,即跳过AMS,直接和WMS交互,生成新窗口,在Android中的Dialog提示框就是这样实现的。因为绕过了AMS,所以在创建新窗口时,不存在生命周期切换的问题,另外,也可以直接控制绘图的区域。

调用方法为:

wm=(WindowManager)getApplicationContext().getSystemService(“window”);

//得到系统WMS服务的binder对象

//wmParams 设置窗口属性

….

//请求WMS生成一个窗口,并将myView加到窗口内容中

wm.addView(myView, wmParams);

4.5浏览器多窗口实现效果

测试环境为Widget测试页面,图中左侧的菜单栏和右侧的时钟显示分别在2个窗口中,左侧菜单栏为父窗口,右侧时钟为子窗口。

使用4.4中的方案二,将浏览器子窗口在WMS申请的新窗口中显示。这样,在图形中可以看到有2个浏览器窗口信息,通过设置窗口的属性,强制子窗口为系统最顶层窗口。

按系统MENU键,弹出系统菜单(即第三方应用程序),此时,效果如下:

由上图可以看出,该方案能实现浏览器在图形中申请多个窗口,并实现第三方应用窗口夹在浏览器窗口中间。

4.6方案实现存在的问题

1.图形侧必须提供设置窗口z序的函数。

由于Android存在AMS、WMS两套服务管理activity和窗口,结构更负责,图层侧难度较大。

2.应用生命周期的问题

当其他应用出现在浏览器主Activity之前时,不论前面弹出了多少个浏览器的子窗口,浏览器的生命周期都进入onPause状态。

3.采用该方案开启4个全屏窗口后,图形buffer溢出,程序崩溃,崩溃信息如下

图形侧buffer申请失败。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/555752.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

response.reset() 与response.resetbuffer使用场景

getResponse的getWriter()方法 getResponse的getWriter()方法连续两次输出流到页面的时候,第二次的流会包括第一次的流,所以可以使用response.reset或者resetBuffer的方法。 reset(): Clears any data that exists in the buffer as well as the statu…

android listview asynctask,关于android:ListView + ArrayList + AsyncTask

本问题已经有最佳答案,请猛点这里访问。我的想法是使用AsynTask下载数据集并存储在arrayList中。 我已经检查并运行良好。在onPostExecute方法中,我调用一个函数来更新listView,然后加载存储在ArrayList中的数据。码:protected vo…

ServletResponse reset()方法慎用

reset()用于重置,但是在重置的时候也会清空相关数据,例如session存的信息。

android10获取imei,Android 10 root用户获取imei

IMEI(International Mobile Equipment Identity)是国际移动设备识别码的缩写,由15-17位数字组成,与手机是一一对应的关系。无论刷机还是恢复出厂设置,该设备标识码都不会改变,所以在广告和流量统计等方面特别好用,备受…

JAVA基础之HttpServletResponse响应

JAVA基础之HttpServletResponse响应 用户在客户端输入网址(虚拟路径)时,开始发送一个HTTP请求(请求行、请求头、请求体)至服务器。服务器内的Tomcat引擎会解析请求的地址,去找XML文件,然后根据…

android imageview 设置网络图片,ImageView加载网络图片

android网络加载图片框架Android-Universal-Image-Loader功能非常强大,其开源地址https://github.com/nostra13/Android-Universal-Image-Loader,讲解非常地详细,今天我要贴下工作中用到的利用这个框架加载网络图片并在ImageView控件中显示出…

Logger之Logger.getLogger(CLass)

之前一直在使用System.out.println()来调试.但是用这种方式开发项目部署到生产环境,会因为众多的控制台输出降低应用的性能.这时候Log4J就成为可平衡开发和部署应用的利器了. 在项目中使用Log4J并不是一件困难的事情,简单粗暴的方式就是在每个类A中声明一个Logger私有属性 pri…

订阅号助手android,微信订阅号助手app

微信订阅号助手app属于微信官方推出的软件,可以把我们的手机当做公众号的平台,让你直接用手机来实现公众号的各种工作、互动内容,微信订阅号助手app不用担心使用一些第三方软件被封号了,非常实用可靠。【应用介绍】订阅号助手是一…

使用LoggerFactory.getLogger(xxx.class)方法在控制台打印日志信息

使用System.out.println()来调试.但是用这种方式开发项目部署到生产环境,会因为众多的控制台输出降低应用的性能.这时候Log4J就成为可平衡开发和部署应用的利器了. 使用指定的类XXX初始化日志对象,方便在日志输出的时候,可以打印出日志信息所属的类。 …

signature=f0dd2033ed5bb3cdb94f9136381f7750,Lesson 8: Signature Assignment

摘要:This unit will focus on the Civil Rights Era in the 1960s. Students will learn what the Civil Rights Movement was and how it changed the United States. By learning about the pivotal leaders of the movement, students will build their underst…

LoggerFactory.getLogger的用法

Logger类下有多个不同的error方法,根据传入参数的个数及类型的不同,自动选择不同的重载方法。 使用,只打印异常,不打印堆栈信息 private static final Logger logger LoggerFactory.getLogger(LoggerTest.class);Testpublic voi…

html自动增加vbs代码,vbs脚本病毒代码大全编步骤四个

应用程序通过ActiveX的属性HTMLPageTextWithTags(主页不嵌有HTML代码时用属性HTMLPageTextWithOutTags)读页面文本交互模式;允许显示用户提示和脚本错误2.ntlm.vbs***************ntlm.vbsby黑嘿黑***************dimwshsetwshCreateObject("WScript.Shell&quo…

java util logger slf4j_别再自己用LoggerFactory生成logger实例了,试试slf4j注解

背景 在项目开发中,记录日志是必做的一件事情。日志的实现有很多种:Logback,Log4j2,log4j,JAVA Util Logging等等。 而slf4j是一个适配层,由适配层决定使用哪一种日志系统,而调用端只需要做的…

正则匹配承兑的html,正则匹配闭合HTML标签(支持嵌套)

原标题:正则匹配闭合HTML标签(支持嵌套)任何复杂的正则表达式都是由简单的子表达式组成的,要想写出复杂的正则来,一方面需要有化繁为简的功底,另外一方面,我们需要从正则引擎的角度去思考问题。关于正则引擎的原理&…

private static Logger logger =Logger.getLogger(AssembleMsgService.class)什么意思?

作为一个新人中的菜鸡,最近在看一个项目的代码其中有这么一段看得我很是费解 public class AssembleMsgService {private static Logger logger Logger.getLogger(AssembleMsgService.class);1、Logger logger logger.getlogger(); 看到这个会想到这是log4j下的…

日志框架介绍(SLF4J及其使用)

本文主要介绍 1.日志框架基本介绍及Spring Boot中默认使用框架(SLF4JLogBack); 2.SLF4J的使用 3.项目中日志框架统一问题 4.Spring Boot中如何实现日志框架统一问题(3的最佳实践) 1. 日志框架基本介绍 一般情况下搭建日志框架时,搭建 日志抽象层(定…

jmeter生成html报告修改,Jmeter生成html报告(示例代码)

新的JMeter版本中引入了Dashboard Report,用于生成HTML页面格式图形化报告的扩展模块。注:本文用的是3.2版本。生成html报告一、检查.jtl文件,如果没有.jtl文件,运行如下命令:jmeter -n -t 天气api.jmx -l result.jtl …

SpringBoot使用Slf4j+Log4j2完成项目的日志记录

SpringBoot使用Slf4jLog4j完成项目的日志记录 前言 本示例采用SpringBoot项目使用SpringAOP记录日志,Slf4j作为日志门面,Log4j2作为日志实现实,实现开发中的日志记录. 部分效果展示 : 日志文件 : 日志信息 : 代码具体实现如下…

鸿蒙构架谁提供的,科普丨关于“鸿蒙”,不知道这些你都不好意思跟别人打招呼!...

鸿蒙的英文名是Harmony OS华为消费者业务CEO余承东8月9日正式发布鸿蒙系统,英文名是Harmony OS 。国家知识产权局商标局网站显示,华为已经申请注册“华为鸿蒙”商标,申请日期是2018年8月24日,注册公告日期是2019年5月14日。鸿蒙是…

SpringBoot——slf4j+logback日志处理及配置详解

SpringBoot——sl4jlogback日志处理及配置详解 日志的级别 打印级别&#xff1a;ALL > TRACE > FATAL > DEBUG > INFO > WARN > ERROR > OFF 输出级别&#xff1a;TRACE > DEBUG > INFO > WARN > ERROR logback-spring.xml配置文件 <…