一 从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的基类?
- 继承:Java是单继承。Manager会不会有继承其他的类需要?通常情况下,Manager是一个独立抽象出来的类,不大可能有继承其他类的需求。
- 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浏览器
应用组件:缓存式远程数据加载组件,缓存式远程图片加载组件,缓存式远程网页加载组件
运营数据加载构架:地址下发,统一版本控制,业务数据远程加载模型
功能模块:导航运营,搜索引擎运营,...