WebView启动Activity以及url路由

一、webview跳启动activity 限制:webview若是设置了WebViewClient,不管自定义协议仍是http(s)协议,点击连接没法启动activity, 必须在shouldOverrideUrlLoading方法中根据url过滤,手动启动activity。因此App内部跳转使用手动拦
截器实现。 需实现效果:有对应的activity实现,就启动activity,没有的话就正常访问点击的连接。html

二、系统浏览器跳启动activity 限制:只能是自定义协议才能启动,http(s)没法启动。因此AndroidManifest.xml中Activity排除使用http(s) 协议。 需实现效果:能启动Activity就启动,不能启动的话就正常访问点击的连接。android

三、第三方app webview跳启动activity 限制:不能启动activity,不能下载,只能浏览。 需实现效果:url能跳转可访问地址则正常访问,若是是404,就重定向到下载界面,下载界面会根据是不是 微信来显示友好提示(在系统浏览器打开)仍是下载。或者直接提示在浏览器中打开。git

最终目的是闭环到app上,没有app的状况url能跳转则跳转,404则重定向到下载界面。github

策略:web

一、正常的url增长参数标识,字段越来短越好。如cmd=xxx; 拦截器中根据这个来跳转。浏览器

二、用自定义协议配置一个跳转RouterActivity,也能够在HomeActivity中处理,在该Activity中用拦截器跳 转。不过最好是在RouterActivity中,这样能够向JumpActivity中那样判断是否app已经被杀掉。微信

<activity
            android:name=".activity.RouterActivity"
            android:theme="@android:style/Theme.NoDisplay">
            <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:scheme="router" android:host="xxx.xxx.com" />
            </intent-filter>
        </activity>

public class RouterActivity extends BaseActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Uri uri = getIntent().getData();
        if (uri != null) {
            UrlInterceptorManager.getInstance().interceptBBS(this, uri.toString());
        }
        finish();
    }

}

三、html界面加载完成后每次都尝试启动activity;点击htlm连接,该连接要有cmd参数,若是是在app内部,webview的shouldOverrideUrlLoading方法中拦截器跳转;若是是系统浏览器,正常跳转,可是到新界面会尝试打开Activity,注意自定义协议的连接也要有cmd。app

经过浏览器直接打开Android应用程序ide

if(navigator.userAgent.match(/android/i))
   {
    var ifrSrc ='router://xxx.xxx.com/appstore/startnewpage?cmd=chatactivity';
    var ifr = document.createElement('iframe');
    ifr.src = ifrSrc;
    ifr.style.display = 'none';
    document.body.appendChild(ifr);
    setTimeout(function() {
        document.body.removeChild(ifr);
    }, 1500);
   }

四、微信中提示浏览器打开。微信浏览器禁止app下载连接怎么办this

五、为了和app内部activity之间跳转统一,能够参考ActivityRouter开源项目。只不过注解只需一个value值,就是cmd的值。拦截器中就能够直接使用Routers.open(),不用 if else判断。

六、路由统一规划设想流程图 输入图片说明

相关文章
相关标签/搜索