android 浏览器之多窗口方案详解
我们android平台是一个又一个的activity组成的,每一个activity有一个或者多个view构成。
所以说,当我们想显示一个界面的时候,我们首先想到的是建立一个activity,然后所有的操作在activity里面实现,或者是一个dialog或者toast。这种方式固然简单,但是在有些情况下,我们要求的只是简单的显示,用activity显然是多余,这个时候,我们如何处理呢?
android的一个应用在底层也是linux的一个进程,但在上层弱化了进程的概念,抽象出了activity这样一种交互。代码直接控制的是activity,用户的交互也是activity。
activity是从用户交互的角度抽象出来的一个对象,在概念和使用上和进程相隔离。进程类似一个收养的功能,一个进程可以有多个activity,不仅可以收养自己当前应用的activity,
也可以收养其他安装包指定给该进程的activity,activity销毁了,进程并不销毁(除非系统需要或代码强制杀死进程)。
原来,整个android的窗口机制是基于一个叫做 windowmanager,这个接口可以添加view到屏幕,
也可以从屏幕删除view。它面向的对象一端是屏幕,另一端就是view,直接忽略我们以前的activity
或者dialog之类的东东。其实我们的activity或者diolog底层的实现也是通过windowmanager,这个
windowmanager是全局的,整个系统就是这个唯一的东东。它是显示view的最底层了。
写一个简单的代码:
java代码
windowmanager mwm = (windowmanager)getsystemservice(context.window_service);
button view = new button(this);
view.settext("window manager test!");
windowmanager.layoutparams mparams = new windowmanager.layoutparams();
mwm.addview(view, mparams);
一般在刚开始开发android时,会犯一个错误,即在view的构造函数中获取getwidth()和getheight(),
当一个view对象创建时,android并不知道其大小,所以getwidth()和getheight()返回的结果是0,
真正大小是在计算布局时才会计算,所以会发现一个有趣的事,即在ondraw( ) 却能取得长宽的原因。
使用windowmanager实现悬浮窗口
windowmanager.layoutparams params;
params = new windowmanager.layoutparams(
viewgroup.layoutparams.match_parent,
viewgroup.layoutparams.wrap_content,
windowmanager.layoutparams.type_phone,//type_application,
windowmanager.layoutparams.flag_not_focusable,
pixelformat.translucent);
params.gravity = gravity.top;
manager.addview(tmpview, params);
就可以将需要加到悬浮窗口中的view加入到窗口中了:
if(view.getparent==null)//如果view没有被加入到某个父组件中,则加入windowmanager中
wmanager.addview(view,wmparams);
其中,view为需要放到悬浮窗口中的视图组件。
如果要将其从windowmanager中移除,则可以执行以下语句:
if(view.getparent()!=null)
wmanager.removeview(view);
android中可按上面的方法增加多个窗口,多个窗口产生的问题:
2. 应用生命周期的问题
当其他应用出现在浏览器主activity之前时,不论前面弹出了多少个浏览器的子窗口,浏览器的生命周期都进入onpause状态。