三步搞定:Vue.js呼叫Android原生操作
阿新 • • 發佈:2020-09-08
第一步: Android對Js的介面,新建AndroidInterfaceForJs.js
import android.content.Context; import android.os.Build; import android.os.Handler; import android.os.Looper; import android.support.annotation.RequiresApi; import android.util.Log; import android.webkit.JavascriptInterface; import android.webkit.ValueCallback; import android.widget.Toast; import com.just.agentweb.AgentWeb; import com.yidumedical.ui.activity.PAWebActivity; /** * Created by shiby on 2018/1/24. */ public class AndroidInterfaceForJS { private Handler deliver = new Handler(Looper.getMainLooper()); private AgentWeb agent; private Context context; public AndroidInterfaceForJS(AgentWeb agent,Context context) { this.agent = agent; this.context = context; } @JavascriptInterface public void callAndroid(final String msg) { deliver.post(new Runnable() { @Override public void run() { Log.i("Info","main Thread:" + Thread.currentThread()); Toast.makeText(context.getApplicationContext(),"" + msg,Toast.LENGTH_LONG).show(); } }); Log.i("Info","Thread:" + Thread.currentThread()); } }
第二步: 給WebView中的window注入物件(例子使用的是AgentWeb)
private void init(){ mAgentWeb = AgentWeb .with(this)//傳入Activity or Fragment .setAgentWebParent(mLinearLayout,new LinearLayout.LayoutParams(-1,-1))//傳入AgentWeb 的父控制元件 ,如果父控制元件為 RelativeLayout , 那麼第二引數需要傳入 RelativeLayout.LayoutParams,第一個引數和第二個引數應該對應。 .useDefaultIndicator()// 使用預設進度條 .defaultProgressBarColor() // 使用預設進度條顏色 .createAgentWeb()// .ready() .go(baseURL); //注入物件 mAgentWeb.getJsInterfaceHolder().addJavaObject("android",new AndroidInterfaceForJS(mAgentWeb,this.getApplicationContext())); AgentWebSettings agentWebSettings = mAgentWeb.getAgentWebSettings(); agentWebSettings.getWebSettings().setDomStorageEnabled(true); } 注入物件: //注入物件 mAgentWeb.getJsInterfaceHolder().addJavaObject("android",this.getApplicationContext()));
第三步:在Vue裡面直接呼叫方法(簡單粗暴法):
window.android.callAndroid('呼叫成功,耶!!!')
考慮到專案的可維護性,一般不這樣寫。
優雅法:
新建app.js
const android = window.android
export { android }
將 window.android存在該模組,方便更改
然後在需要的.js或者.vue檔案中,匯入app模組,然後使用
import {android} from '../app' try { android.callAndroid('呼叫成功,耶!!!') } catch (e) { console.log('出現錯誤,如果在非android環境下訪問,出現該警告是正常的.') }
補充知識:vue與原生安卓相互呼叫
最近公司有做直播類的專案,由於直播框架限制,限制所用的技術是vue搭建的H5頁面嵌入到原生安卓中。由於之前沒有過類似的混合開發經驗,所以今天寫篇部落格加深下印象。
vue.js呼叫安卓方法
先將vue專案放到一個內網地址或者外網地址中,然後安卓端通過“webView.loadUrl()”將vue專案引入。安卓端將要呼叫的方法名暴露在window物件中,由vue直接在methods中呼叫並攜帶引數。
methods:{ goPublish(){ //將vue專案引入至安卓程式碼中,安卓方法暴露在window中,vue中可以直接用window去調取方法。 window.android.callAndroidMethod('1','2') } }
安卓呼叫vue.js中的方法
同樣的vue也需要把方法新增到window中去,再由安卓端去調取方法。
created(){ //需要在created鉤子中將方法新增到window物件中 window.setFun = this.setFun; },methods:{ setFun(arg) { //arg: 原生呼叫Vue時傳值(arg)給Vue console.log("獲取到android的傳參:" + arg); },}
以上就是vue與安卓端專案呼叫的大致方法,有用詞不當的地方望海涵且不吝指正。希望能給大家一個參考,也希望大家多多支援我們。