1. 程式人生 > >個人總結之H5呼叫本地app

個人總結之H5呼叫本地app

  首先既然H5和本地app達到互動,所以得有個標識,通過這個標識來開啟app ,這時候就需要我們app端在manifest中的入口activity中新增scheme,也就是類似標識是的,這時候網頁端可以通過這個scheme來開啟我們的app,但是如果想要給我們app傳遞引數的話,那麼就不好使了,所以這時候還需要 新增host,就可以了,程式碼如下

           <intent-filter>
                <actionandroid:name="android.intent.action.MAIN" />
                <
categoryandroid:name="android.intent.category.LAUNCHER" />
            </intent-filter>                          <intent-filter>                  <actionandroid:name="android.intent.action.VIEW" />                  <categoryandroid:name="android.intent.category.DEFAULT" />                 <
categoryandroid:name="android.intent.category.BROWSABLE"/>
                <dataandroid:scheme="abcd"android:host="hello"/>             </intent-filter>

這樣就可以了,H5就可以開啟我們的app了,當然既然人家給我們傳遞了引數,那麼我們這邊肯定要獲取的吧,所以我們可以在入口activity中如下操作,來獲取引數

           Intent intent = getIntent();
            Uri uri = intent.getData();
            String
 scheme = intent.getScheme();                          tv_web.setVisibility(View.GONE);             idnoH = uri.getQueryParameter("idno");             System.out.println(idnoH+"idno");

這裡的idno就是H5那麼傳遞引數的key,通過key來獲取value

       當然常用的還有使用webview來和js互動,這就很簡單了, 首先我們要先對webview進行一些設定, 第一條很關鍵,true表示和js可以互動, false反之

WebSettings set = mWebView.getSettings();
		set.setJavaScriptEnabled(true);//設定是否直接javascript格式
		set.setDefaultZoom(ZoomDensity.MEDIUM); //----設定縮放級別
		set.setDefaultTextEncodingName("UTF-8");//---設定編碼格式
		set.setAllowContentAccess(true);
		set.setAppCacheEnabled(false);
		set.setBuiltInZoomControls(false);
		set.setUseWideViewPort(true);
		set.setUseWideViewPort(true); 
		set.setLoadWithOverviewMode(true);

     1. 先說下,js呼叫Android中的方法

//第一個引數是 供給js呼叫的類,第二個引數是js中要用到的呼叫這個類中的方法的物件,可以隨便起
mWebView.addJavascriptInterface(new FromAndroid(context), "AndroidToJs");

   說一下,這裡的FromAndroid的這個類不能是內部類,不知為何,反正我先用的是內部類,是調不出來裡面的方法,


/**
 * 這是js從android呼叫方法的類
 * @author Administrator
 *
 */
public classFromAndroid{
	Context context;
	publicFromAndroid(Context context){
		this.context = context;
	}
	 @JavascriptInterface
	publicvoidfromAndroid(String name){
		MyToastUtils.show(context, name);
	}
}

  在JS中程式碼就更簡單了

function showToast(){
	AndroidToJs.fromAndroid("我是js呼叫android的吐司");
}

   完畢!!!

 2. 然後說下在Android中呼叫JS的方法

  在Android中的程式碼其實很簡單

//這是呼叫js中的方法
 fragment7_btn.setOnClickListener(new OnClickListener() {
        @Override
	public void onClick(View v) {
	   mWebView.loadUrl("javascript:fromJS('嘎嘎')");
	}
});

  說明下, 這裡fromJS()這個方法是JS中的方法名, 而裡面的引數是android部分可以傳給js的,然後就可以修改到網頁中的內容,當然也可以不傳,直接在js端寫死了,android部分呼叫,直接顯示就可以

 在JS端的程式碼

function fromJS(param){
	alert(param);
	document.getElementById('fromJS').innerHTML="我是android呼叫JS的方法";
	showToast();
	document.getElementById('fromJS').innerHTML=param;
				
}

 這裡的fromJS的這個ID其實就是一個div,為了就是直接顯示出來,還如上面說的一樣,如果不用android傳引數,直接fromJS()這個方法中param就不用寫,直接一個無參的方法,然後JS端這邊類似"我是android呼叫的JS方法" 這樣,寫死就好了; 如果想用android傳參,並顯示,直接把param賦值給div就好了

 完畢!!!!