从0开始设计Android浏览器

一 从Android App讲起

Activity <- LAUNCHER

<intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

载体

应用载体: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浏览器

处理外链

<intent-filter>
    <action android:name="android.intent.action.VIEW"/>
    <category android:name="android.intent.category.BROWSABLE"/>
</intent-filter>

浏览网页

应用组件: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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容