从0开始设计Android浏览器

一 从Android App讲起

Activity <- LAUNCHER


    
    

载体

应用载体:Application
用户交互载体:Activity
系统交互载体:Service,Receiver,Provider

Activity

Activity -> DecorView -> ContentView -> 视图(So many)

视图呈现:Activity VS View?
Activity:独立,生命周期由系统管理,呈现代价大。
View:呈现代价小,生命周期管理需要自己实现。

Activity创建代价大于View
Activity切换由系统管理,无法实现复杂的切换效果,如手势滑动切换。

单Activity架构:完全控制

二 视图架构

需要些什么?

V1

View Layers

主视图 -> MainView层
工具栏+菜单 -> ControlView层
飘浮视图 -> FloatView层
子视图 -> FeatureView层
对话框 -> DialogView层

ViewManager

视图统一管理 -> RootView()
showControl
showFeature
showDialog

单一内容视图层 级联内容视图层
MainView FeatureView
ControlView \
FloatView \
DialogView \

级联内容视图层
视图层级控制:Show,Hide,Animation
视图生命周期管理:Callback

问题:DialogView层是否需要作为级联内容视图层,多层叠放?

V2

需要直接将视图设为Activity的ContentView -> SuperiorView || IntroView || SplashView
系统弹出层:SysLayout

View从哪来?
View <- Data <- 功能
功能 = 基础 + 业务

三 基础构架

基础功能

载体
UI
数据
网络
线程池
工具

组件库

组件 = 核心组件 + 应用组件
核心组件:与应用无关,多应用移植
应用组件:应用相关

四 业务架构 - 模块化模型

业务众多 -> 模块化

模块化模型

模块 = MVC
C = Manager + Bridger 对外桥接
Manager提供对外调用接口
Bridger对外调用
Manager和Bridger都是角色,实现时可以合并在Manager中。

模块生命周期

模块生命周期由Manager统一管理
生命长短:Long-term || Short-term

Long-term -> Manager单例(getInstance())

问题来了:Manager通常需要Context(创建视图,获取资源等),Context如何传入

getInstance(Context) ? NO!

怎么解决, 继承一个带Context的基类?

  1. 继承:Java是单继承。Manager会不会有继承其他的类需要?通常情况下,Manager是一个独立抽象出来的类,不大可能有继承其他类的需求。
  2. Context基类:应用呈现时必然有Context,Context基类跟随载体(Activity、Service)进行初始化和释放。

It works。

ContextContainer

sContext
Activity.onCreate -> ContextContainer.activityStart(Context)
Activity.onDestroy -> ContextConainer.recycle

问题来了:应用被系统回收时,不回调onDestroy,ContextContainer如何释放?

幸运的是:虽然Android宣称,会回收整体应用,也会回收单个Activity。但实际上,如果Activity不运行在独立进程上,是不会被单独回收的。所以在这个模型中,Activity和应用的系统回收视为一体的。当应用都被回收了,ContextContainer也不会考虑了。

ContextContainer提供易得的Context

ContextContainer统一管理Context引用,减少内存泄漏的可能。

Manager生命周期

Short-term:Create -> Use -> Recycle。即用即销

Long-term:Create/Use/Reuse/Recycle。跟随Activity生命周期 || 跟随应用生命周期

跟随Activity生命周期

Activity: onCreate -> Running -> onDestory
Manager:Create -> Use -> Recycle

跟随应用生命周期(可重用设计模型)

Activity: onCreate -> Running -> onDestroy
Manager:Create/Reuse -> Use ->Patitial Recycle

模块化基础架构

ModuleManager <- BasicManager

BasicManager统一管理模块生命周期

热启动重用模型(下回分解)

模块化业务实现

模块内业务内聚

模块间交互?模块与视图管理交互?

五 事件架构

事件调度中心

ControlCenter:一对一
EventCenter :多对多

模块生命周期管理

BasicManager:同一管理模块生命周期

六 5层架构

自上而下:

业务层:主页,浏览,插件等
调度层:ControlCenter,EventCenter,BasicManager
载体层:系统载体Application、Activity、Service,Provider,视图管理,数据管理,网络管理,线程管理,主题管理
应用组件层:UI,数据,网络,工具
核心组件层:UI,数据,网络,工具

七 Android浏览器

处理外链


    
    

浏览网页

应用组件:WebView
功能模块
基础:浏览,多窗口管理
中级:导航,书签,历史
高级:浏览增强,Web-Native交互,数据同步

浏览模块

权限:INTERNET

设置(WebSetting)

JavaScript开关
无图开关
无痕开关
网页字体大小

接口(WebView)

loadUrl
goBack/goForward
canGoBack/canGoForward
reload/stop

回调(WebViewClient,WebChromeClient)

onReceiveTitle -> 网页标题
onReceivedIcon -> favoicon
shouldOverrideUrlLoading -> 拦截网页加载(处理特殊scheme)
onProgressChange -> 加载进度
onPageStart/onPageFinish -> 网页加载开始/完成(不准,跳转会走多次)
onDownloadStart -> 下载
onCreateWindow -> 新窗口(_blank)
onShowCustomView/onHideCustomView -> 显示/隐藏自定义视图(网页视频全屏)
onJsAlert/onJsConfirm/onJsPrompt  -> 网页弹框(网页alert,confirm,prompt)
onSelectLocalFile -> 文件选择(网页上传文件)

浏览增强

系统内核
夜间模式:注入JS,修改网页CSS
loadUrl(javascript:xxx) || evaluateJavascript

手势前进后退
上层视图手势 + goBack/goForwardcanGoBack/canGoForward + TouchMode(反射调用)

全屏模式
修改视图大小

网页保存
saveWebArchive

翻页模式
pageDown/pageUp

阅读模式
JS + HTML主体提取

内核定制

云端加速
广告拦截
地址栏滑动隐藏
智能拼接

Web-Native交互

addJavascriptInterface
onJsPrompt

JsCallbacker
RabbitHole

八 可运营的Android浏览器

应用组件:缓存式远程数据加载组件,缓存式远程图片加载组件,缓存式远程网页加载组件
运营数据加载构架:地址下发,统一版本控制,业务数据远程加载模型
功能模块:导航运营,搜索引擎运营,...

End

你可能感兴趣的:(从0开始设计Android浏览器)