如果我們目前的項(xiàng)目是Android的,但是接下來(lái)我們希望部分頁(yè)面可以使用Flutter進(jìn)行開(kāi)發(fā),甚至我們希望在Native頁(yè)面中嵌入FlutterUI組件,那么我們?cè)撊绾螌?shí)現(xiàn)呢?
成都創(chuàng)新互聯(lián)公司"三網(wǎng)合一"的企業(yè)建站思路。企業(yè)可建設(shè)擁有電腦版、微信版、手機(jī)版的企業(yè)網(wǎng)站。實(shí)現(xiàn)跨屏營(yíng)銷(xiāo),產(chǎn)品發(fā)布一步更新,電腦網(wǎng)絡(luò)+移動(dòng)網(wǎng)絡(luò)一網(wǎng)打盡,滿(mǎn)足企業(yè)的營(yíng)銷(xiāo)需求!成都創(chuàng)新互聯(lián)公司具備承接各種類(lèi)型的成都網(wǎng)站制作、做網(wǎng)站項(xiàng)目的能力。經(jīng)過(guò)十多年的努力的開(kāi)拓,為不同行業(yè)的企事業(yè)單位提供了優(yōu)質(zhì)的服務(wù),并獲得了客戶(hù)的一致好評(píng)。
假設(shè)你現(xiàn)在Android項(xiàng)目的目錄的結(jié)構(gòu)是這樣的
這時(shí)候如果你想創(chuàng)建一個(gè)Flutter模塊,使得Android模塊和Flutter模塊之間可以進(jìn)行交互,我們可以通過(guò)Android Studio新建一個(gè)Flutter Module,具體過(guò)程是:File — New — New Module ,之后選擇Flutter Module,指定Project Location的路徑為
也就是說(shuō),最終你的項(xiàng)目結(jié)構(gòu)會(huì)是這樣的
接下來(lái)在Android Module的 build.gradle 文件中添加flutter依賴(lài)
先創(chuàng)建一個(gè)Flutter頁(yè)面
這里比較重要的是 window.defaultRouteName 這個(gè)字段,這個(gè)字段可以接收從Native傳遞過(guò)來(lái)的參數(shù) (下文我們會(huì)介紹原生傳遞參數(shù)的方法),也就是說(shuō)通過(guò)這個(gè)字段我們就可以進(jìn)行Flutter頁(yè)面的路由的分發(fā)
我們可以直接在Android的 MainActivity 中啟動(dòng)一個(gè) FlutterActivity ,這里的 initialRoute 方法中傳遞的參數(shù)就對(duì)應(yīng)Flutter層的 window.defaultRouteName
注意:需要在 AndroidManifest.xml 注冊(cè) FlutterActivity
自己創(chuàng)建一個(gè) FlutterAppActivity 繼承自 FlutterActivity
在 MainActivity 中啟動(dòng) FlutterAppActivity (另外別忘了在 AndroidManifest.xml 中注冊(cè) FlutterAppActivity )
兩種啟動(dòng)方式的區(qū)別
如果單純只是想打開(kāi)一個(gè)Flutter頁(yè)面,兩種方式實(shí)際上基本沒(méi)有太大區(qū)別,第一種方式也許還會(huì)更簡(jiǎn)單一點(diǎn)。但是,在Flutter開(kāi)發(fā)中,我們往往還需要開(kāi)發(fā)一些Native插件供Flutter調(diào)用,如果使用復(fù)寫(xiě) FlutterActivity 的方式更有利于我們?cè)?FlutterActivity 中注冊(cè)我們的Native插件,所以實(shí)際開(kāi)發(fā)中一般推薦使用第二種方式
擴(kuò)展思考
initialRoute 從名稱(chēng)上看起來(lái)是Flutter提供給我們進(jìn)行Native與Flutter交互的路由跳轉(zhuǎn)的,但是實(shí)際上他就是一個(gè)字符串,我們不僅僅可以傳遞一個(gè)路由名稱(chēng),有時(shí)候我們也可以通過(guò)這個(gè)參數(shù)傳遞一串JSON數(shù)據(jù),然后在Flutter端進(jìn)行解析,這樣我們就可以通過(guò)這個(gè)參數(shù)做更多的事情
activity_main.xml
FrameLayout 用于承載Flutter組件
MainActivity.java
使用 FragmentManager 將 FlutterFragment 添加到 FrameLayout 容器中
運(yùn)行結(jié)果
上半部分是原生的TextView,下半部分是Flutter的Text組件
本節(jié)主要介紹了Native和Flutter之間的頁(yè)面跳轉(zhuǎn),以及同一個(gè)頁(yè)面中Native與Flutter組件的組合。接下來(lái)會(huì)介紹如何編寫(xiě)Android插件與Flutter進(jìn)行數(shù)據(jù)交互
Cordova是一個(gè)廣泛使用的Hybrid開(kāi)發(fā)框架,它提供了一套js和Native交互規(guī)范
在Cordova的SystemWebViewEngine類(lèi)中可以
看到私有靜態(tài)void exposeJsInterface(WebView webView,CordovaBridge橋){
if((Build.VERSION.SDK_INT Build.VERSION_CODES.JELLY_BEAN_MR1)){
Log.i(TAG,“自Android版本以來(lái)已禁用addJavascriptInterface()橋接?!保?
//錯(cuò)誤是Java Strings不會(huì)自動(dòng)轉(zhuǎn)換為JS字符串。
//在JS方面解決這個(gè)問(wèn)題并不困難,但是更容易
使用提示橋來(lái)代替。
返回;
}
webView.addJavascriptInterface(新SystemExposedJsApi(橋), “_cordovaNative”);
}
因此當(dāng)Android系統(tǒng)高于4.2時(shí),Cordova還是使用addJavascriptInterface這種方式,因?yàn)檫@個(gè)方法在高版本上安全而且簡(jiǎn)單,低于4.2的時(shí)候,用什么方法呢?
答案是WebChromeClient.onJsPrompt方法
WebView可以設(shè)置一個(gè)WebChromeClient對(duì)象,它可以處理js的3個(gè)方法
onJsAlert
onJsConfirm
onJsPrompt
這3個(gè)方法分別對(duì)應(yīng)js的警告,確認(rèn),提示方法,因?yàn)橹挥刑崾窘邮辗祷刂?,所以js調(diào)用一個(gè)Native方法后可以等待Native返回一個(gè)參數(shù)。下面是cordova.js中的一段代碼:
/ **
*實(shí)現(xiàn)ExposedJsApi.java的API,但使用prompt()進(jìn)行通信。
*這是在JellyBean之前使用的,其中addJavascriptInterface()被禁用。
* /
module.exports = {
exec:function(bridgeSecret,service,action,callbackId,argsJson){
return prompt(argsJson,'gap:'+ JSON.stringify([bridgeSecret,service,action,callbackId]));
},
setNativeToJsBridgeMode:function(bridgeSecret,value){
prompt(value,'gap_bridge_mode:'+ bridgeSecret);
},
retrieveJsMessages:function(bridgeSecret,fromOnlineEvent){
return prompt(+ fromOnlineEvent,'gap_poll:'+ bridgeSecret);
}
};
然后只要在onJsPrompt方法中使用CordovaBridge來(lái)處理js的提示調(diào)用
/ **
*告訴客戶(hù)端向用戶(hù)顯示提示對(duì)話(huà)框。如果客戶(hù)端返回true,則WebView將假定客戶(hù)端將處理提示對(duì)話(huà)框并調(diào)用相應(yīng)的JsPromptResult方法。
* p /
*由于我們出于自己的目的黑客提示,我們不應(yīng)該為此目的使用它們,也許我們應(yīng)該破解console.log來(lái)代替!
* /
@Override
public boolean onJsPrompt(WebView視圖,String origin,String message,String defaultValue,final JsPromptResult result){
//與@JavascriptInterface橋不同,此方法始終在UI線程上調(diào)用。
String processedRet = parentEngine.bridge.promptOnJsPrompt(origin,message,defaultValue);
if(processedRet!= null){
result.confirm(processedRet);
} else {
dialogsHelper.showPrompt(message,defaultValue,new CordovaDialogsHelper.Result(){
@
Override public void gotResult(boolean success,String value){
if(success){
result.confirm(value);
} else {
result.cancel( );
}
}
});
}
return true;
}
混合開(kāi)發(fā)的App(Hybrid App)就是在一個(gè)App中內(nèi)嵌一個(gè)輕量級(jí)的瀏覽器,一部分原生的功能改為Html 5來(lái)開(kāi)發(fā),這部分功能不僅能夠在不升級(jí)App的情況下動(dòng)態(tài)更新,而且可以在Android或iOS的App上同時(shí)運(yùn)行,讓用戶(hù)的體驗(yàn)更好又可以節(jié)省開(kāi)發(fā)的資源。
一、Adobe Edge
目前還處于預(yù)覽階段的Adobe
Edge是用HTML5、CSS、JavaScript開(kāi)發(fā)動(dòng)態(tài)互動(dòng)內(nèi)容的設(shè)計(jì)工具。內(nèi)容可以同時(shí)兼容移動(dòng)設(shè)備和桌面電腦。Edge的一個(gè)重要功能是
Web工具包界面,方便確保頁(yè)面在不同瀏覽器中的架構(gòu)一致性,此外Edge還將整合TypeKit這樣的字體服務(wù)。
動(dòng)畫(huà)和圖形可以添
加到HTML元素中,程序也能通過(guò)Edge自身的代碼片段庫(kù)或者JavaScript代碼進(jìn)行擴(kuò)展。動(dòng)畫(huà)可以在獨(dú)立的時(shí)間線上進(jìn)行嵌套,還能實(shí)現(xiàn)互動(dòng)功
能。符合可以服用并通過(guò)API和代碼片段控制。通過(guò)Edge設(shè)計(jì)的內(nèi)容可以兼容iOS和Android設(shè)備,也可以運(yùn)行在火狐、Chrome、
Safari和IE9等主流瀏覽器。
二、Adobe Dreamweaver CS6
Adobe
Dreamweaver CS6作為一個(gè)Web設(shè)計(jì)軟件,提供了對(duì)HTML網(wǎng)站和移動(dòng)程序的可視化編輯界面。其Fluid
Grid排版系統(tǒng)整合CSS樣式表功能,提供自適應(yīng)版面的跨平臺(tái)兼容性。開(kāi)發(fā)者可以完全實(shí)現(xiàn)Web設(shè)計(jì)的可視化操作,無(wú)需為代碼所困。
用戶(hù)不但還能在Live View中預(yù)覽,還提供多屏幕預(yù)覽功能。開(kāi)發(fā)者可以通過(guò)MultiScreen預(yù)覽面板查看HTML5內(nèi)容的渲染效果。Live View通過(guò)WebKit渲染引擎支持HTML5。
三、Adobe ColdFusion 10
ColdFusion是用來(lái)開(kāi)發(fā)企業(yè)Web程序的服務(wù)器端技術(shù),通過(guò)Websockets、互動(dòng)表單、視頻和地理標(biāo)簽等HTML5技術(shù)創(chuàng)建富媒體用戶(hù)體驗(yàn)。
四、Sencha Architect 2
在開(kāi)發(fā)移動(dòng)和桌面應(yīng)用的工具中,Sencha的定位是HTML5可視化應(yīng)用開(kāi)發(fā)。開(kāi)發(fā)團(tuán)隊(duì)可以在一個(gè)單一集成的環(huán)境中完成應(yīng)用的設(shè)計(jì)、開(kāi)發(fā)和部署。開(kāi)發(fā)者還可以開(kāi)發(fā)Sencha Touch2和Ext JS4 JavaScript應(yīng)用,并實(shí)時(shí)預(yù)覽。
五、Sencha Touch 2
Sencha Touch2是移動(dòng)應(yīng)用框架,也被看作是Sencha的HTML5平臺(tái)。開(kāi)發(fā)者可以用它開(kāi)發(fā)面向iOS、Android和Blackberry、Kindle Fire等多種平臺(tái)的移動(dòng)應(yīng)用。
六、Dojo Foundation Maqetta
來(lái)自于IBM的一個(gè)項(xiàng)目,Dojo Foundation Maqetta是為桌面和移動(dòng)設(shè)備開(kāi)發(fā)HTML5應(yīng)用的開(kāi)源工具,支持在瀏覽器中查看HTML5界面。用戶(hù)體驗(yàn)設(shè)計(jì)師可以通過(guò)拖放組裝UI樣板
七、微軟Visual Studio 2010 ServicePack 1
雖然一開(kāi)始并不支持HTML5,但微軟在2011年三月發(fā)布的Visual Studio 2010 SP1中提供了IntelliSense,追加了針對(duì)HTML5的一些元素。
八、JetBrains WebStorm 4.0
作為擁有HTML編輯器的JavaScript集成開(kāi)發(fā)環(huán)境,WebStorm4.0提供了開(kāi)發(fā)web應(yīng)用的HTML5樣板。開(kāi)發(fā)者可以在創(chuàng)建HTML文檔時(shí)可獲得對(duì)HTML5文件的支持。例如砍伐者鍵入。開(kāi)發(fā)者還可以在chrome瀏覽器中實(shí)時(shí)預(yù)覽HTML文檔。
九、Google Web Toolkit
該開(kāi)發(fā)工具用于開(kāi)發(fā)瀏覽器應(yīng)用,但庫(kù)中支持很多HTML5功能。包括對(duì)客戶(hù)端或web存儲(chǔ)的支持。其他HTML5功能還包括支持Canvas可視化,以及音頻和視頻widget。
十、DCloud HBuilder
HBuilder是當(dāng)前最快的HTML開(kāi)發(fā)工具,強(qiáng)大的代碼助手幫你快速完成開(kāi)發(fā),最全的語(yǔ)法庫(kù)和瀏覽器兼容性數(shù)據(jù)讓瀏覽器碎片化不再頭痛。
Cordova是一個(gè)廣泛使用的Hybrid開(kāi)發(fā)框架,它提供了一套js和Native交互規(guī)范
在Cordova的 SystemWebViewEngine 類(lèi)中可以看到
private static void exposeJsInterface(WebView webView, CordovaBridge bridge) {
if ((Build.VERSION.SDK_INT Build.VERSION_CODES.JELLY_BEAN_MR1)) {
Log.i(TAG, "Disabled addJavascriptInterface() bridge since Android version is old.");
// Bug being that Java Strings do not get converted to JS strings automatically.
// This isn't hard to work-around on the JS side, but it's easier to just
// use the prompt bridge instead.
return;
}
webView.addJavascriptInterface(new SystemExposedJsApi(bridge), "_cordovaNative");
}
因此當(dāng)Android系統(tǒng)高于4.2時(shí),Cordova還是使用 addJavascriptInterface 這種方式,因?yàn)檫@個(gè)方法在高版本上安全而且簡(jiǎn)單,低于4.2的時(shí)候,用什么方法呢?
答案是 WebChromeClient.onJsPrompt 方法
WebView可以設(shè)置一個(gè) WebChromeClient 對(duì)象,它可以處理js的3個(gè)方法
onJsAlert
onJsConfirm
onJsPrompt
這3個(gè)方法分別對(duì)應(yīng)js的 alert 、 confirm 、 prompt 方法,因?yàn)橹挥?prompt 接收返回值,所以js調(diào)用一個(gè)Native方法后可以等待Native返回一個(gè)參數(shù)。下面是 cordova.js 中的一段代碼:
/**
* Implements the API of ExposedJsApi.java, but uses prompt() to communicate.
* This is used pre-JellyBean, where addJavascriptInterface() is disabled.
*/
module.exports = {
exec: function(bridgeSecret, service, action, callbackId, argsJson) {
return prompt(argsJson, 'gap:'+JSON.stringify([bridgeSecret, service, action, callbackId]));
},
setNativeToJsBridgeMode: function(bridgeSecret, value) {
prompt(value, 'gap_bridge_mode:' + bridgeSecret);
},
retrieveJsMessages: function(bridgeSecret, fromOnlineEvent) {
return prompt(+fromOnlineEvent, 'gap_poll:' + bridgeSecret);
}
};
然后只要在 onJsPrompt 方法中使用 CordovaBridge 來(lái)處理js的prompt調(diào)用
/**
* Tell the client to display a prompt dialog to the user. If the client returns true, WebView will assume that the client will handle the prompt dialog and call the appropriate JsPromptResult method.
* p/
* Since we are hacking prompts for our own purposes, we should not be using them for this purpose, perhaps we should hack console.log to do this instead!
*/
@Override
public boolean onJsPrompt(WebView view, String origin, String message, String defaultValue, final JsPromptResult result) {
// Unlike the @JavascriptInterface bridge, this method is always called on the UI thread.
String handledRet = parentEngine.bridge.promptOnJsPrompt(origin, message, defaultValue);
if (handledRet != null) {
result.confirm(handledRet);
} else {
dialogsHelper.showPrompt(message, defaultValue, new CordovaDialogsHelper.Result() {
@Override
public void gotResult(boolean success, String value) {
if (success) {
result.confirm(value);
} else {
result.cancel();
}
}
});
}
return true;
}
文章名稱(chēng):android混合開(kāi)發(fā),android混合開(kāi)發(fā)怎么獲取flutter界面的截圖
文章位置:http://aaarwkj.com/article36/dssjgsg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)、動(dòng)態(tài)網(wǎng)站、軟件開(kāi)發(fā)、外貿(mào)建站、企業(yè)建站、全網(wǎng)營(yíng)銷(xiāo)推廣
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)