如何完整的隐藏android activity
android activity 渲染逻辑是个复杂而庞大的系统逻辑, 牵涉到客户端渲染, 系统端渲染, 软件渲染, 硬件渲染, java代码处理逻辑, cpp代码处理逻辑.写过activity的朋友都清楚, activity渲染是从layout.xml文件开始, 在xml文件里定义了activity使用的各种控件已经他们的布局关系.系统从读取这份文件开始渲染, 首先解析各个控件的布局关系, 为每个控件分配空间.如果用代码动态修改了这份文件(增加和删除控件,或者修改控件属性), 每次修改都会触发系统重新解析文件, 重新执行后面的逻辑.当每个控件都分配好空间和位置后, 就会把控制权逐个分配给挂在layout树的每个节点控件了, 进行控件的渲染. 控件渲染有两种模式, 一种是cpu渲染(软件渲染), 一种是gpu渲染(硬件渲染).cpu渲染,是调用一组特定的cpu画图api, 把内容直接渲染出来. 而gpu渲染是把渲染指令装入到DisplayList列表中, 然后post给gpu渲染线程, 使用gpu高速渲染.两者渲染方式对比, cpu渲染方式在main thead里把所有的内容都渲染出来了, main thread干的活更多, gpu渲染方式只是在main thread把渲染指令加入到DisplayList, main thread干的活相对教轻, 所以使用gpu渲染方式界面表现地更加流畅.activity的所有内容都渲染到一个叫surface的对象上, 然后通过native的api, 把这个surface post到android系统服务进程中, 系统服务进程然后把所有客户端post过来的surface按照一定的规则, 合成最终显示的画面, 交给display显示出来.activity的view树是挂在一个root view的下面, 可以通过activity.getWindow().getDecorView()得到, 如果要隐藏整个activity, 就是要把activity变透明, 让这个activity下面的activity的内容显示到最前面.如果只调用activity.getWindow().getDecorView().setAlpha(0.0f) 是没有用的, 这样做只是把root view变透明了, 界面上显示的一层全黑的画布.这层画布是surface的底色, activity所有的内容都这块画布上渲染, 如果只把activity的渲染内容设置成透明, 那么画布的底色就会显现出来, 遮挡了下层activity的内容.有没有什么方式让surface画布也变透明呢? 有的, 有的,兄弟, 就是调用下面神奇的api:activity.setTheme(android.R.style.Theme_Translucent_NoTitleBar);//先把activity的主题设置成可透明主题activity.setTranslucent(true);// setTranslucent(true) 把surface画布变成透明这样做就可以把activity变成完全透明, 下层的activity的内容才能完全无遮挡的显示出来.