安卓和原生如何交互
① 安卓原生系統是什麼意思
原生安卓系統(Android)是指Google公司發布,沒有經過第三方修改的安卓系統,是操作系統最基層的也是最純凈的版本。
一般來說,主要是指各操作系統生產商最初建立的模型,各公司在模型的基礎上再不斷改進和優化,生產出不同的新版本。
(1)安卓和原生如何交互擴展閱讀:
Android是一種基於Linux的自由及開放源代碼的操作系統,主要使用於移動設備,如智能手機和平板電腦,由Google公司和開放手機聯盟領導及開發。
尚未有統一中文名稱,中國大陸地區較多人使用「安卓」或「安致」。Android操作系統最初由Andy Rubin開發,主要支持手機。
2005年8月由Google收購注資。2007年11月,Google與84家硬體製造商、軟體開發商及電信營運商組建開放手機聯盟共同研發改良Android系統。
隨後Google以Apache開源許可證的授權方式,發布了Android的源代碼。第一部Android智能手機發布於2008年10月。
Android逐漸擴展到平板電腦及其他領域上,如電視、數碼相機、游戲機、智能手錶等。2011年第一季度,Android在全球的市場份額首次超過塞班系統,躍居全球第一。
2013年的第四季度,Android平台手機的全球市場份額已經達到78.1%。 2013年09月24日谷歌開發的操作系統Android在迎來了5歲生日,全世界採用這款系統的設備數量已經達到10億台。
2014第一季度Android平台已佔所有移動廣告流量來源的42.8%,首度超越iOS。但運營收入不及iOS。
參考資料:網路---原生安卓
② 安卓怎樣與伺服器的交互
利用HTTP請求啊 ,完成登陸等操作啊 , 如果需要與伺服器進行數據交互,可以選擇XML或者webservice進行數據交互 查看原帖>>
③ apicloud項目如何與安卓原生框架進行數據交互
這個的話我覺得你那個編程裡面的互換東西應該是沒有寫清楚吧或者寫的有一點不清楚這樣你可以再找一下他的願原源代碼換一下
④ HBuilder移動項目與原生app之間如何交互
可以傳參。和原生應用互相傳參類似。
第三方應用調用時傳遞的參數在5+App里可以通過plus.runtime.arguments獲取。
⑤ crodova怎麼直接調用android原生方法
crodova直接調用android原生方法的時候要了解一些東西,你可以看下!我發你看下,
一.總體結構
Cordova的目標是用HTML,JS,來完成手機客戶端的開發,並且是只開發一次可以在各種手機平台上跑,所以理想狀態是用JS去控制所有事件。Cordova基於WebView組件。每個繼承自DroidGap的Activity對應一個獨立的CordovaWebView。Cordova提供了一些列的JS介面來訪問Android的native。以插件(Plugin)的形式提供自定義介面給JS端訪問。
二.一些疑問
1. Cordova框架是如何啟動的?
2. 插件是怎麼回事?如何工作的。
3. Cordova的官方文檔都是說JS如何訪問Android的native,那麼在Android的native中是否可以訪問JS的函數?如何訪問?
三.結構解剖
1.Cordova的啟動
1) 如何啟動
Cordova提供了一個Class(DroidGap)和一個interface(CordovaInterface)來讓Android開發者開發Cordova。一般情況下實現DroidGap即可,因為DroidGap類已經做了很多准備工作,可以說DroidGap類是Cordova框架的一個重要部分;如果在必要的情況下實現CordovaInterface介面,那麼這個類中很多DroidGap的功能需要自己去實現。
繼承了DroidGap或者CordovaInterface的Activity就是一個獨立的Cordova模塊,獨立的Cordova模塊指的是每個實現了DroidGap或者CordovaInterface介面的Activity都對應一套獨立的WebView,Plugin,PluginManager,沒有共享的。(我覺得這樣是很不爽的,沒有共享,如果plugin和Activity很多的情況下這樣是相當的耗資源)
當在實現了DroidGap或者CordovaInterface介面的Activity的onCreate方法中調用DroidGap的loadUrl方法即啟動了Cordova框架。
2)啟動過程
public class A extends DroidGap{}
a. 在A的onCreate方法中首先調用super. onCreate()
這一步中創建了一個LinearLayout(.class)布局,以及計算這個Layout的大小及顯示的一些方式。在後面的過程中會將一個WebView加到這個LinearLayout中。
b. 再次調用DroidGap 的loadUrl()方法
DroidGap. loadUrl()中首先判斷A的CordovaWebView是否實例化,如果沒有回實例化一個CordovaWebView對象並將該對象添加到父LinearLayout中去,同時將該LinearLayout添加的ContentView。見以下代碼:
public void onCreate(Bundle savedInstanceState) {
…
root = new (this, width, height);
…
}
public void init() {
CordovaWebView webView = new CordovaWebView(DroidGap.this);
this.init(webView,
new CordovaWebViewClient(this, webView),
new CordovaChromeClient(this, webView));
}
public void init(CordovaWebView webView, CordovaWebViewClient webViewClient, CordovaChromeClient webChromeClient) {
this.appView = webView;
this.appView.setId(100);
…
this.root.addView(this.appView);
setContentView(this.root);
}
public void loadUrl(String url) {
if (this.appView == null) {
this.init();
}
…
}
這樣就完成了我們在一般開發中使用的模式:
public void onCreate(Bundle savedInstanceState) {
super. onCreate(Bundle savedInstanceState);
setContentView(resID);
…
}
在初始化完CordovaWebView後調用CordovaWebView.loadUrl()。此時完成Cordova的啟動。
c. 在實例化CordovaWebView的時候, CordovaWebView對象會去創建一個屬於當前CordovaWebView對象的插件管理器PluginManager對象,一個消息隊列NativeToJsMessageQueue對象,一個javascriptInterface對象ExposedJsApi,並將ExposedJsApi對象添加到CordovaWebView中,JavascriptInterface名字為:_cordovaNative。
d. Cordova的JavascriptInterface
在創建ExposedJsApi時需要CordovaWebView的PluginManager對象和NativeToJsMessageQueue對象。因為所有的JS端與Android native代碼交互都是通過ExposedJsApi對象的exec方法。
在exec方法中執行PluginManager的exec方法,PluginManager去查找具體的Plugin並實例化然後再執行Plugin的execute方法,並根據同步標識判斷是同步返回給JS消息還是非同步。由NativeToJsMessageQueue統一管理返回給JS的消息。
e. 何時載入Plugin,如何載入
Cordova在啟動每個Activity的時候都會將配置文件中的所有plugin載入到PluginManager。那麼是什麼時候將這些plugin載入到PluginManager的呢?
在b中說了最後會調用CordovaWebView.loadUrl(),對,就在這個時候會去初始化PluginManager並載入plugin。PluginManager在載入plugin的時候並不是馬上實例化plugin對象,而是只是將plugin的Class名字保存到一個hashmap中,用service名字作為key值。
當JS端通過JavascriptInterface介面的ExposedJsApi對象請求Android時,PluginManager會從hashmap中查找到plugin,如果該plugin還未實例化,利用java反射機制實例化該plugin,並執行plugin的execute方法。
2.Cordova插件
在『1』中已經接觸了些Cordova插件的東西,這里總結下Cordova的插件
Cordova插件只是一個普通的java類,沒有什麼特殊之處。插件中的execute方法只是Cordova框架的一個規定。
Cordova為了方便於插件的管理,所以引進了一個PluginManager來管理插件。在ExposedJsApi中,PluginManager起一個代理作用。
在原生態的WebView開發中,我們可以給WebView添加一個JavascriptInterface對象來使JS可以訪問android的代碼;在Cordova也有一個這樣的對象ExposedJsApi。
在ExposedJsApi中,它將請求轉發給我們的PluginManager,這個時候PluginManager會根據給的service的名字來查找具體的Plugin並執行。
所以,我認為Cordova插件是android端的API,提供給JS。
在Cordova雖然有JavascriptInterface對象ExposedJsApi,但在JS端並不是真正通過android提供的window.JavascriptInterface.request這種方式來請求。在JS端,Cordova是通過JS的prompt()函數觸發ChromeClient中的onJsPrompt方法,通過onJsPrompt去獲取到請求,再將請求轉發給ExposedJsApi。
註:在Cordova中,Java端和JavaScript端都准備了代碼來使用特殊URL('http://cdv_exec/' + service + '#' + action + '#' + callbackId + '#' + argsJson;)的方式交互請求,但並沒有真正使用。
3.Cordova的數據返回
Cordova中通過exec()函數請求android插件,數據的返回可同步也可以非同步於exec()函數的請求。
在開發android插件的時候可以重寫public boolean isSynch(String action)方法來決定是同步還是非同步。
Cordova在android端使用了一個隊列(NativeToJsMessageQueue)來專門管理返回給JS的數據。
1)同步
Cordova在執行完exec()後,android會馬上返回數據,但不一定就是該次請求的數據,可能是前面某次請求的數據;因為當exec()請求的插件是允許同步返回數據的情況下,Cordova也是從NativeToJsMessageQueue隊列頭pop頭數據並返回。然後再根據callbackID反向查找某個JS請求,並將數據返回給該請求的success函數。
2)非同步
Cordova在執行完exec()後並不會同步得到一個返回數據。Cordova在執行exec()的同時啟動了一個XMLHttpRequest對象方式或者prompt()函數方式的循環函數來不停的去獲取NativeToJsMessageQueue隊列中的數據,並根據callbackID反向查找到相對應的JS請求,並將該數據交給success函數。
註:Cordova對本地的HTML文件(file:// 開頭的URL)或者手機設置有代理的情況下使用XMLHttpRequest方式獲取返回數據,其他則使用prompt()函數方式獲取返回數據。
4.Android代碼訪問JS
翻了Cordova的官方文檔和Cordova代碼,發現Cordova並未提供一種方式來讓我們在Android中去訪問JS。現在想來可能是這樣的道理(個人觀點),因為Cordova框架的性質就是一個用HTML+JS來開發APP的,相當於java用的虛擬機層(比喻不是很恰當),所以Cordova未提供Android訪問JS的方式。
如果需要Android訪問JS,只有使用原生態WebView開發的方式
loadUrl(「javascript:xxx」)
因為在Cordova框架中需要訪問JS的時候也是使用的這種方式,如下(Activity的onResume事件):
public void handleResume(boolean keepRunning, boolean activityResultKeepRunning)
{
// Send resume event to JavaScript
this.loadUrl("javascript:try{cordova.fireDocumentEvent('resume');}catch(e){console.log('exception firing resume event from native');};");
// Forward to plugins
if (this.pluginManager != null) {
this.pluginManager.onResume(keepRunning);
}
// Resume JavaScript timers (including setInterval)
this.resumeTimers();
paused = false;
}
⑥ 在Android上怎樣實現JAVA和JS交互
在Android的開發過程中、遇到一個新需求、那就是讓Java代碼和Javascript代碼進行交互、在IOS中實現起來很麻煩、而在Android中相對來說容易、Android對這種交互進行很好的封裝、其實可以很簡單的用Java代碼調用WebView中的js函數、也可以用WebView中的js來調用Android應用中的Java代碼
一、網頁的JS代碼調用ANDROID中JAVA代碼的方法
在網頁中調用java代碼、需要在webview控制項中添加javascriptInterface
contentWebView = (WebView) findViewById(R.id.webview);
//啟用javascript
contentWebView.getSettings().setJavaScriptEnabled(true);
contentWebView.addJavascriptInterface(this, "js對象名");
在Activity中定義一個要被js調用的方法、src為js傳遞過來的參數、如果沒有不傳也可以的。
public void jsFunction(final String str) {
Toast.makeText(this, str, Toast.LENGTH_SHORT).show();
runOnUiThread(new Runnable() {
@Override
public void run() {
//在里對Android應用的UI進行處理
}
});
}
在網頁中、只需要像調用js方法一樣、進行調用就可以
<a onClick="window.js對象名.jsFunction(´hello world´)" >
點擊調用java代碼並傳遞參數
</a>
二、ANDROID中JAVA代碼調用網頁的JS代碼的方法
Java代碼調用js並傳參其實是通過WebView的loadUrl方法去調用的、只是參數url的寫法不一樣
// 無參數調用
contentWebView.loadUrl("javascript:javacalljs()");
// 傳遞參數調用
contentWebView.loadUrl("javascript:javacalljswithargs("
+ "´hello world´" + ")");
三、JAVA和JS交互注意事項
1、Java 調用 js 裡面的函數、效率並不是很高、估計要200ms左右吧、做交互性很強的事情、這種速度很難讓人接受、而js去調Java的方法、速度很快、50ms左右、所以盡量用js調用Java方法
2、Java 調用 js 的函數、沒有返回值、調用就控制不到
3、Js 調用 Java 的方法、返回值如果是字元串、你會發現這個字元串是 native 的、轉成 locale 的才能正常使用、使用 toLocaleString() 函數就可以、不過這個函數的速度並不快、轉化的字元串如果很多、將會很耗費時間
4、網頁中盡量不要使用jQuery、執行起來需要5-6秒、最好使用原生的js寫業務腳本、以提升載入速度、改善用戶體驗
⑦ 原生APP中js怎樣與Android和ios進行交互
一、對於Android和ios我們要執行不同的操作,下面是判斷系統的js代碼
// alert(ismobile(1)); 1表示Android,0表示ios
function ismobile(test){
var u = navigator.userAgent, app = navigator.appVersion;
if(/AppleWebKit.*Mobile/i.test(navigator.userAgent) || (/MIDP|SymbianOS|NOKIA|SAMSUNG|LG|NEC|TCL|Alcatel|BIRD|DBTEL|Dopod|PHILIPS|HAIER|LENOVO|MOT-|Nokia|SonyEricsson|SIE-|Amoi|ZTE/.test(navigator.userAgent))){
if(window.location.href.indexOf("?mobile")<0){
try{
if(/iPhone|mac|iPod|iPad/i.test(navigator.userAgent)){
return '0';
}else{
return '1';
}
}catch(e){}
}
}else if( u.indexOf('iPad') > -1){
return '0';
}else{
return '1';
}
}
二、js調用app端函數,下面是js代碼
if(ismobile(1)==1){
Android.setTypeActivity(id,type,href);
}else{
jsToios(id,type,href);
}
setTypeActivity是Android端定義的函數,jsToios是ios端定義的函數,括弧里是js端傳遞的參數。
三、至於js端怎樣獲取app端的數據,只需在js端提供給app端函數名字,在通知app端調用即可
四、還有一種方法可以不通過app的方法將數據傳遞給另一個頁面,那就是通過URL的方式
在本頁面將數據拼接在ip後面
在另外一個頁面通過下面方法獲取URL後的參數
function GetRequest() {
var url = location.search; //獲取url中"?"符後的字串
var theRequest = new Object();
if (url.indexOf("?") != -1) {
var str = url.substr(1);
strs = str.split("&");
for(var i = 0; i < strs.length; i ++) {
theRequest[strs[i].split("=")[0]]=decodeURIComponent(strs[i].split("=")[1]);
}
}
return theRequest;
}
// 獲取URL參數
var Request = new Object();
Request = GetRequest();
var name;
name = Request['name'];
⑧ 原生安卓和定製安卓有什麼區別
國產定製安卓基本允許在免Root狀態下,就能控制應用自啟、許可權和相互喚醒等原本是取得Root許可權之後才能實現的功能,甚至這一功能還在三星等部分國際大廠的系統中實現;而原生Android系統則無法對這些直接進行設置,只能Root後通過第三方應用進行管理,且目前並不是太穩定。
由於國內的安卓應用濫用喚醒許可權和通知欄推送,因而經常會導致多條推送一起騷擾用戶,讓用戶防不勝防,而這一功能實際上是不少國內用戶所需要的。
原生Android的界面和字體都是完全統一的,系統內沒有自帶的主題引擎。注意,原生安卓不等於CM等支持主題引擎的第三方ROM。而定製安卓為了張揚用戶的個性,基本都會內置專用的主題或字體引擎方便用戶更換。
由於加入了各種各樣的定製功能,定製安卓的系統往往顯得比較臃腫,即使另外不運行app,運存佔用也是非常大的。而原生Android主打的則是極度精簡,佔用運存較小,即使是小運存手機,在管理好許可權的基礎上也不至於卡死。
國產定製安卓在交互理念上有些像iOS,就是把所有的功能都給用戶准備好了,這樣用戶只需要自己開關某些功能,即可充分實現自定義。
而原生Android則不同,其設置菜單僅有一些最基本的選項,以滿足用戶使用。如果你動手能力較強的話,原生Android反而能提供更大的發揮空間讓你充分的DIY。
原生安卓內置的應用商店是安卓系統的官方商店,前身叫安卓市場(Android Market),現在叫作谷歌Play商店。其擁有最正規、許可權最干凈且更新速度最快的一手國內外安卓app資源,但同樣因為不可描述原因無法直接訪問。
因此,國內各大廠商也在定製安卓中加入了自己的應用商店,很多都是掛靠在應用寶等第三方市場下,實現資源互通。
⑨ 安卓原生系統和普通安卓系統的區別
1. 原生android系統是指Google公司發布,沒有經過第三方修改的安卓系統。比如lephone的leos,m9的系統以及移動的ophone
2. 普通安卓系統就是系統雖然都是安卓,不同品牌的手機肯定會自己定製一些東西,如桌面,軟體,解鎖等
原生系統的優勢在於,google官方會以原生系統為開發標准,新的android系統都是原生的。在沒有添加任何廠商定製功能的基礎上,純原生的效率應該是最好的。而且升級也會比較優先。
原生android系統是指google公司發布,沒有經過第三方修改的安卓系統。通常手機app的開發方向包括webview和原生兩個,webview可以統一平台,開發迅速等特點,但是反應速度卻是很慢。
原生android系統是指Google公司發布的最原始最純凈的安卓系統,沒有經過任何(手機廠商)的第三方修改,是手機中最完美的系統。因為開源導致一樣的安卓系統有的很流暢有的很卡頓,現在一些手機玩家已經不考慮手機的硬體配置只要它是原生就行
⑩ 安卓系統有原生的和非原生的有什麼區別
原生的是指完全都是google出品的樣子,非原生的是指在此基礎上修改過的,比如lephone的leos,m9的系統以及移動的ophone,建議要買就買原生的