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判斷。

六、路由統一規劃設想流程圖 輸入圖片說明

相關文章
相關標籤/搜索