webView最好放另外一個進程 優(yōu)點1:風(fēng)險隔離,web掛了不影響app 優(yōu)點2:可以讓linux給app申請跟多的內(nèi)存
多進程通信主要是aidl , aidl 主要就是 要擁有一個 web2Main的一個接口吗氏, 當(dāng)我們點擊web上的東西時候倔韭。回傳給app(這個web2Main的接口可以包含一個main2Web的callback的回調(diào)弥臼,方便web--->app---->web 這一套流程的傳遞)
以下操作:使用命令模式+接口下沉進行绿渣,簡化操作
1.可以再web的模塊中朝群,定義一個Command接口{ String name , void execute(....) },再App模塊實現(xiàn)中符,
2.使用google提供的AutoService 自定義注解庫姜胖,對標(biāo)記Command注解的類進行,自動解析
ServiceLoader<Command> serviceLoader = ServiceLoader.load(Command.class);
這個方法可以拿到所有Comannd的注解類淀散,然后遍歷谭期,按照name執(zhí)行對應(yīng)的 excute()
要求web的html中的name 和Command實現(xiàn)類當(dāng)中的name 一樣
webView 一些簡單操作:
1WebViewDefaultSettings 一些默認(rèn)的Settings 網(wǎng)上可以百度到
2WebChromeClient 可以實現(xiàn)打日志功能onConsoleMessage , 設(shè)置標(biāo)題onReceivedTitle 等等
3WebViewClient 可以onPageStarted吧凉,onPageFinished,onReceivedError等響應(yīng)
4WebView 可以 addJavascriptInterface(this, "AAAA")為web增加名字踏志,方便html阀捅,js調(diào)用
@JavascriptInterface 注解到具體的方法,方便執(zhí)行html针余,js中的回調(diào)
==========準(zhǔn)備部分如下:=======================================
物料:
1.再Manifest中聲明一個MainCommandService服務(wù)饲鄙,伴隨運行
2.MainCommandService----->onBind()---->綁定一個MainCommandsManager
3.1MainCommandsManager 實現(xiàn) web2mainInterface.Stub 的web2main的aidl接口
3.2MainCommandsManager 構(gòu)造方法中通過以下方法將命令收集起來
ServiceLoader<Command> serviceLoader = ServiceLoader.load(Command.class)
mCommands.put(command.name(), command);
4,a再BaseWebView.init()中--->WebCommandDispatcher.initAidlConnection()
b--->application和MainCommandService綁定凄诞,
c----->再onServiceConnected 獲取web2mainAidl = web2mainInterface.Stub.asInterface(service);
這就保證了 MainCommandService服務(wù)不掛我web2mainAidl 也不為null
========下面流程部分:==============================================
流程:
// step1 ,html--點擊按鈕--->webview.js--->BaseWebView中的takeNativeAction
---->web2mainAidl.handleWebCommand------->MainCommandsManager.handleWebCommand--->進行分發(fā)------>MainCommandsManager中通過 mCommands.get(commandName).execute(params, callback);進行匹配執(zhí)行----->回調(diào)到web2mainAidl中Callbackmain2web中------>baseWebView.handleCallback
--->evaluateJavascript最終到WebView之中 。完成一次 web-->main-->web的操作