1. 程式人生 > 程式設計 >三步搞定:Vue.js呼叫Android原生操作

三步搞定:Vue.js呼叫Android原生操作

第一步: 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與安卓端專案呼叫的大致方法,有用詞不當的地方望海涵且不吝指正。希望能給大家一個參考,也希望大家多多支援我們。