app内嵌H5页面与其他app的交互

有两种方法:


一、通过H5页面所在的app调用另一个app

1、HTML链接处理

首先做成HTML的内容,url格式如下:

<a href="[scheme]://[host]/[path]?[query]">点我a>

说明:
schema: 判断启动的App

host: 标记

path: 标记,可无

query: 传值的(key,value)键值对,可无

例如:

启动应用程序  

本例中做如下超链接跳转:

<a href="finance://pay.com/mpos?orderId=1020160126"> Open APP a>  

其中:

schema —- finance 对应Android中 android:schema

host ---  pay.com   对应android中 android:host

 path ---  mpos   对应android中 android:pathPrefix

query --- orderId=1020160102  为Html链接和APP相互传递的数据,可以在Uri中通过getQueryParameter 方法获取

全部Html源码:

  
<html>  
<head>  
<meta charset="UTF-8">  
<title>mpostitle>  
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=0">  
<meta name="imagemode" content="force">  
<meta name="apple-mobile-web-app-capable" content="yes">  
<meta name="apple-mobile-web-app-status-bar-style" content="black">  
<meta name="format-detection" content="telephone=no">  
head>  
<body>  
<h1>H5打开APPh1>  
<a href="finance://pay.com/mpos?orderId=102016000"> Open APP a>  
body>  
html>  

2、android中如何处理?

1)在AndroidManifest.xml文件中,在需要跳转到的Activity中添加如下声明:

<activity  
       android:name=".ui.activity.OrderDetailActivity"  
       android:configChanges="keyboardHidden|orientation"  
       android:exported="true"  
       android:label="@string/app_name"  
       android:theme="@style/CustomTitle">  

       <intent-filter>  
           <category android:name="android.intent.category.BROWSABLE" />  
           <category android:name="android.intent.category.DEFAULT" />  
           <action android:name="android.intent.action.VIEW" />  
           <data  
               android:host="pay.com"  
               android:pathPrefix="/mpos"  
               android:scheme="finance" />  
       intent-filter>  
   activity>  

2)如何获取链接中传递的数据?

if (getIntent() != null) {  
    if (Intent.ACTION_VIEW.equals(action)) {  
                Uri uri = Uri.parse(getIntent().getDataString());  
                if (uri != null) {  
            String orderId = uri.getQueryParameter("orderId");  
        }  
    }  
 }  

3、应该注意的地方?
1)链接打开的Activity中,【android.intent.action.MAIN】和【android.intent.category.LAUNCHER】这2个,不能与这次追加的内容混合在一起;如果跳转的刚好是启动Activity,可以写一个类继承启动类。

2)参考:http://blog.csdn.NET/jiangwei0910410003/article/details/23940445

二、由H5页面直接调起另一个app

1、WebView基础设置如下:

String mUrl = "http://10.0.41.19:8099/TomcatTest/web_app_upload_image.html";  
        WebSettings webSettings = webView.getSettings();  
        //设置WebView属性,能够执行Javascript脚本  
        webSettings.setJavaScriptEnabled(true);  
        //设置可以访问文件  
        webSettings.setAllowFileAccess(true);  
        //设置支持缩放  
        webSettings.setBuiltInZoomControls(true);  
        //加载需要显示的网页  
        // 加载 asset目录下的本地html文件: mUrl = "file:///android_asset/web_app.html"  
        webView.loadUrl(mUrl);  
        //设置WebViewClient用来辅助WebView处理各种通知请求事件等,如更新历史记录、网页开始加载/完毕、报告错误信息等  
        webView.setWebViewClient(new WebViewClient() {  

            // 以下方法避免 自动打开系统自带的浏览器,而是让新打开的网页在当前的WebView中显示  
            @Override  
            public boolean shouldOverrideUrlLoading(WebView view, String url) {  
                view.loadUrl(url);  
                return true;  
            }  
        });  

        // 用于辅助WebView处理JavaScript的对话框、网站图标、网站标题以及网页加载进度等  
        webView.setWebChromeClient(new WebChromeClient() {  

            @Override  
            public void onReceivedTitle(WebView view, String title) {  
                tv_title.setText(title);  
            }  
        });  
        // 使 H5可调用Native方法: android.nativeMethod()  
        webView.addJavascriptInterface(new MyJsInterface(), "android");  

2、H5 调用 Native 方法实现 H5页面 按钮点击事件处理,代码如下:

type="button" value="JS Call Native: Toast Message" onclick="android.toastMessage()">   
 App WebViewActivity类中处理
public class MyJsInterface {  

        @JavascriptInterface  
        public void toastMessage(String msg) {  
            Toast.makeText(WebViewActivity.this, "app to H5 toast " + msg, Toast.LENGTH_SHORT).show();  
            Intent intent = new Intent(WebViewActivity.this, FirstActivity.class);  
            WebViewActivity.this.startActivity(intent);  
        } 

3、Native 传递数据给 H5,场景:点击原生页面的标题栏按钮,给H5页面传值 并且更新 H5页面:

// 点击原生按钮,向H5页面发送数据,可更新H5页面  
tv_click.setOnClickListener(new View.OnClickListener() {  
    @Override  
    public void onClick(View v) {  
        String msg = "from Native";  
        // loadUrl必须在主线程中执行  
        webView.loadUrl("javascript:toNative('" + msg + "')");  
    }  
});  
 H5 中页面数据更新代码:
<input type="text" value="hhhh" id="pp"/>  

<script type="text/javascript">   
    // 2. js供 Native 调用的方法  
    function toNative(msg) {  
        alert("Hello, from H5, received msg: " + msg);  
        var p = document.getElementById("pp");  
        p.value = msg;  
    }  
script>   

你可能感兴趣的:(app,android,前端)