Webview里JS跳转到Activity页面

有两种方法.

第一种是通过webview提供的js和java沟通的接口进行

public void addJavascriptInterface(Object object, String name) 

然后,在javascript里可以通过name来引用到object对象里有@JavascriptInterface注解的方法

Java代码

  WebView wv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        wv = (WebView)findViewById(R.id.webView);
        wv.getSettings().setJavaScriptEnabled(true);
        wv.addJavascriptInterface(this, "nativeMethod");
        wv.loadUrl("file:///android_asset/index.html");
    }

    @JavascriptInterface
    public void toActivity(String activityName) {
        //此处应该定义常量对应,同时提供给web页面编写者
        if(TextUtils.equals(activityName, "a")){
            startActivity(new Intent(this,AActivity.class));
        }else{
            startActivity(new Intent(this,BActivity.class));
        }
    }

javascript代码

<!DOCTYPE HTML>
<html>

<script type="text/javascript">
  function gotoActivity (activity) {
    nativeMethod.toActivity(activity);
  }
</script>
<body>

<button onClick="gotoActivity('a')">gotoActivity A</button>
<button onClick="gotoActivity('b')">gotoActivity B</button>

</body>
</html>

以上是第一种方法,在index.html页面可以跳转到AActivity和BActivity。

第二种方式里是利用系统提供的Activity隐式启动。

<!DOCTYPE HTML>
<html>

<body>
<a href="myapp://tonative/param?id=123">gotoActivity B</a>
<a href="http://www.baidu.com">open http link</a>
<a href="file:///android_asset/b.html">open local file</a>

</body>
</html>

当我们在webview里加载上面的代码,并点击gotoActivity B后,系统会去寻找能处理uri为”myapp://tonative/param?id=123”的Activity,默认情况下当然是没有的,所以我们可以把要打开的Activity按照约定的uri协议进行声明

<activity android:name=".BActivity"
            android:parentActivityName=".AActivity">
            <intent-filter>
                <action android:name="android.intent.action.VIEW"/>
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data
                    android:host="tonative"
                    android:scheme="myapp" />
            </intent-filter>
        </activity>

我们可以通过声明不同的host实现打开不同的Activity,在打开的Activity里可以通过如下代码获取html页面传过来的参数

 Intent intent = getIntent();
        String action = intent.getAction();
        if(Intent.ACTION_VIEW.equals(action)){
            Uri uri = intent.getData();
            if(uri != null){
                String id = uri.getQueryParameter("id");
                Toast.makeText(this,id,Toast.LENGTH_LONG).show();
            }
        }

但这样其实有个问题,我们一般会在自己的WebviewActivity里给

 wv.setWebViewClient(new WebViewClient(){})

从而实现在本页内的跳转都是由本Webview打开,而不是跳转到系统浏览器处理。这样设置后,‘href=”myapp://tonative/param?id=123”’这样的请求也被拦截到了本Webview里,从而失效,因此,我们需要做一个判断

 wv.setWebViewClient(new WebViewClient(){
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {

                String scheme = Uri.parse(url).getScheme();//还需要判断host
                if (TextUtils.equals("myapp", scheme)) {
                    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
                    startActivity(intent);
                    return true;
                }
                return false;
            }
        });

return true,表明这次请求交给系统来处理。
京东金融App里有很多的活动页面是h5,点击可以跳转到原生的基金购买页面,用Fiddler拦截想看一下他们采用的方式,但是拦截到js这些是可以的,但html解出来的都是乱码,可能他们采用了加密?

  • 13
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值