1. 程式人生 > >ARouter解析三:URL跳轉本地頁面原始碼分析

ARouter解析三:URL跳轉本地頁面原始碼分析

在前面文章中對ARouter中頁面跳轉和原始碼進行了分析,今天我們來學習下通過URL跳轉本地頁面的使用和跳轉原始碼分析。在看這篇文章之前建議小夥伴們先看下ARouter解析一:基本使用及頁面註冊原始碼解析,先對ARouter有個整體的瞭解。

通過URL跳轉也免不了前面的準備工作,比如ARouter例項的獲取,初始化,構造路由資訊的PostCard,PostCard的完善等都是一樣的,我們這裡就不再重複炒飯了,有需要的同學自行參考ARouter解析二:頁面跳轉原始碼分析.

栗子還是用的官方Demo,看下跳轉效果。

主介面.png

點選“通過URL跳轉”,會通過WebView載入html檔案:

連結H5.png

點選第一個連結會跳轉到Test1Activity介面:

Test1Activity.png

接下來我們先來看下URL跳轉到本地頁面怎麼使用。

1.URL跳轉簡單使用

首先需要載入一個H5頁面,使用方式還是一致的,通過單例模式獲取ARouter例項,傳入path“/test/webview”構建PostCard,用來儲存跳轉的所有資訊。傳入一個H5頁面地址的引數,呼叫navigation就可以跳轉到path路徑對應的介面。

ARouter.getInstance().build("/test/webview")
                     .withString("url", "file:///android_asset/schame-test.html")
                     .navigation();

我們看下這個介面的程式碼,邏輯很簡單。通過WebView載入url對應的H5頁面,也就是前面傳入的htmlfile:///android_asset/schame-test.html

@Route(path = "/test/webview")
public class TestWebview extends Activity {

    WebView webview;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test_webview);


        webview = (WebView) findViewById(R.id.webview);
        webview.loadUrl(getIntent().getStringExtra("url"
)); } }

簡單看下html介面的程式碼,簡單我們就看下第一個跳轉連結的效果。點選會會觸發href屬性的連結arouter://m.aliyun.com/test/activity1.

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title></title>
</head>

<body>

<h2>跳轉測試</h2>

<h2>自定義Scheme[通常來說都是這樣的]</h2>
<p><a href="arouter://m.aliyun.com/test/activity1">arouter://m.aliyun.com/test/activity1</a></p>
<p><a href="arouter://m.aliyun.com/test/activity1?url=https%3a%2f%2fm.abc.com%3fa%3db%26c%3dd">測試URL Encode情況</a></p>
<p><a href="arouter://m.aliyun.com/test/activity1?name=alex&age=18&boy=true&high=180&obj=%7b%22name%22%3a%22jack%22%2c%22id%22%3a666%7d">arouter://m.aliyun.com/test/activity1?name=alex&age=18&boy=true&high=180&obj={"name":"jack","id":"666"}</a></p>
<p><a href="arouter://m.aliyun.com/test/activity2">arouter://m.aliyun.com/test/activity2</a></p>
<p><a href="arouter://m.aliyun.com/test/activity2?key1=value1">arouter://m.aliyun.com/test/activity2?key1=value1</a></p>
<p><a href="arouter://m.aliyun.com/test/activity3?name=alex&age=18&boy=true&high=180">arouter://m.aliyun.com/test/activity3?name=alex&age=18&boy=true&high=180</a></p>

<h2>App Links[防止被App遮蔽]</h2>
<p><a href="http://m.aliyun.com/test/activity1">http://m.aliyun.com/test/activity1</a></p>
<p><a href="http://m.aliyun.com/test/activity2">http://m.aliyun.com/test/activity2</a></p>

</body>
</html>

有沒有感覺很神奇?為什麼點選一個連結會跳轉到我們 本地的頁面?繼續往後看就有分曉了。

URL的跳轉很簡單就是一句話,和頁面跳轉的邏輯是一樣的,這裡多了一個載入H5頁面的步驟,只不過是為了模擬URL跳轉本地介面的功能。

2.URL跳轉原始碼分析

在上面我們留了個疑問,為什麼在WebView中點選一個連結能跳轉到我們APP本地的頁面?一般會有個常用的做法,就是給WebView新增一個WebViewClient,然後實現shouldOverrideUrlLoading方法,在方法中構造intent進行跳轉。邏輯示意程式碼就是這樣:

webview.setWebViewClient(new WebViewClient(){
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                if (url != null && url.contains("arouter")){
                    Intent intent = new Intent(TestWebview.this, Test1Activity.class);
                    startActivity(intent);
                    return true;
                }
                return super.shouldOverrideUrlLoading(view, url);
            }
});

通過* shouldOverrideUrlLoading*攔截url跳轉,然後根據自己的需要進行跳轉。那麼ARouter是這樣的嗎?淡然不是了,要不就沒有這篇分享的必要了,逃:)

首先我們先來分析下,上面這種寫法的缺點。

1.在webView中直接寫跳轉邏輯,有點硬編碼的味道,另外如果一個APP中有很多頁面需要這種跳轉邏輯,不可能每個介面新增一個WebView控制元件,只能在父類介面中新增共同新增一個WebView控制元件,然後統一進行攔截,那麼這時候邏輯就會顯得有點臃腫了。

2.另外一個缺點就是,比如另外一個應用需要跳轉到我們APP的Test1Activity怎麼做?這時候就不是在自己APP的WebView環境中了,這種方法就起不了作用了。所以在大型APP中不是一種很好的設計。

那麼ARouter怎麼做的呢?小夥伴們還記得隱式跳轉嗎?ARouter就是通過註冊一個沒有UI的介面來統一處理scheme是arouter的跳轉請求。我們看下程式碼:

<activity android:name=".SchemeFilterActivity">

            <!-- Schame -->
            <intent-filter>
                <data
                    android:host="m.aliyun.com"
                    android:scheme="arouter"/>

                <action android:name="android.intent.action.VIEW"/>

                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="android.intent.category.BROWSABLE"/>
            </intent-filter>
        </activity>

在清單檔案中註冊了SchemeFilterActivity這個activity,scheme就是arouter, host就是m.aliyun.com,其中有個categoryandroid.intent.category.BROWSABLE,這樣就可以在WebView中跳轉SchemeFilterActivity這個介面了。有個注意點,能跳轉SchemeFilterActivity的必要條件就是需要匹配intent-filter中的data, action, category的標籤,其中category匹配任意一個即可。接著看下SchemeFilterActivity這個介面:

public class SchemeFilterActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

//        直接通過ARouter處理外部Uri
        Uri uri = getIntent().getData();
        ARouter.getInstance().build(uri).navigation(this, new NavCallback() {
            @Override
            public void onArrival(Postcard postcard) {
                finish();
            }
        });
    }
}

會不會有的小夥伴不相信會跳到這?還不信我的人品嗎?好吧,我在這裡面打了個斷點,我沒騙人吧。同時可以看到拿到了H5介面點選的連結arouter://m.aliyun.com/test/activity1.

SchemeFilterActivity.png

有了這個連結,後面其實就是頁面跳轉的邏輯了,同ARouter解析二:頁面跳轉原始碼分析原始碼跳轉是一致的,這裡就不再貼上一次了。

那麼這樣使用有什麼好處呢?

1.首先就是頁面跳轉的靈活性,比如需要和H5中進行通訊,H5需要跳轉到APP本地的頁面,Native和H5只需要統一一個path文件即可,H5通過path構造一個url就可以實現跳轉到對應頁面的功能,很類似瀏覽器,實現很好的解耦。

2.相比較於隱式的intent,每一個從外面跳轉進來的頁面都需要註冊上intent-filter,每個頁面都需要設定export=true,也就是需要讓每一個頁面都可以匯出,在外部可以訪問到。這樣做會帶來非常嚴重的安全風險,就像是一個房子有十個門還是隻有一個門,看門的成本是不同的。而現在使用的這種場景只需要對外暴露出一個activity,然後在這個activity中註冊一個intent-filter,這樣之後所有的外部路由請求都會經過這唯一的門,然後在這個activity中獲取到URL並將其交給ARouter,剩下的就由路由框架做分發了。

3.另外一個好處就是隱式intent跳轉無法將引數自動注入,ARouter可以在url中攜帶引數然後自動注入,這個我們這次分享沒有涉及到,下一個分享會涉及。

3.總結

今天URL跳轉本地頁面原始碼的內容就是這些,有了前面兩篇分享的基礎到這裡就比較輕鬆愉快了。使用方式都是都是一行程式碼搞定,和Activity跳轉不同的就是需要考慮外部導航到本地頁面的需求,因此需要在清單檔案中宣告一個activity,這個activity不需要頁面,用來統一獲取url請求,然後再交給路由框架進行跳轉。

你們的贊是我堅持下去最大的動力,謝謝!

相關推薦

ARouter解析URL本地頁面原始碼分析

在前面文章中對ARouter中頁面跳轉和原始碼進行了分析,今天我們來學習下通過URL跳轉本地頁面的使用和跳轉原始碼分析。在看這篇文章之前建議小夥伴們先看下ARouter解析一:基本使用及頁面註冊原始碼解析,先對ARouter有個整體的瞭解。通過URL跳轉也免不了前面的準備工作,比如ARouter例項的獲取,初

SpringMVC檢視解析器和url問題

轉自: SpringMVC檢視解析器 前言    在前一篇部落格中講了SpringMVC的Controller控制器,在這篇部落格中將接著介紹一下SpringMVC檢視解析器。當我們對SpringMVC控制的資源發起請求時,這些請求都會被SpringMVC的Disp

ionic學習(十三)ionic到外部連結url

外掛地址:https://ionicframework.com/docs/native/in-app-browser/ 使用方法: 1.新增外掛: ionic cordova plugin add cordova-plugin-inappbrowser npm install --sav

Tomcat實現不帶專案名稱訪問,實現方式自動到指定頁面,不改變URL

tomcat實現不帶專案名稱訪問專案 當通過瀏覽器訪問tomcat時,如果只有ip+埠而沒有專案名稱,則訪問的是webapps/ROOT/index.html, 修改Tomcat的webapps/ROOT/index.html自動跳轉到指定url即可 自動跳轉到指定

學徒淺析Android開發雜談——WebView的url時方法執行順序

本篇文章已授權微信公眾號guolin_blog(郭霖)獨家釋出  在實際專案開發中,我們用到WebView的場景,大多是在對接協議、第三方應用或網頁時出現。對於頁面載入,WebView沒有自帶等待效果。所以,需要我們去自定義各種帶進度條的WebView,網上相關的例子也是不

拼接字串到url頁面解析

什麼時候需要前端頁面之間互相傳遞資訊呢? 比如說(原諒我又要用最愛的淘寶舉個栗子了,哈哈): 我們在這個搜尋框裡面輸入我們想搜尋的內容,然後點選搜尋,跳轉頁面之後會變成這個樣子: 我們發現我們我們在上一個頁面輸入的資訊被帶到了跳轉到的新頁面裡面。

Web前端如何實現選擇select下拉框選中其他頁面

option chang 前端 實現 cati onchange 下拉框選中 b- class <select onchange="window.location=this.value;"><option value="a.html">用戶管理<

URL

url跳轉1.由於應用越來越多的需要和其他的第三方應用交互,以及在自身應用內部根據不同的邏輯將用戶引 向到不同的頁面,譬如一個典型的登錄接口就經常需要在認證成功之後將用戶引導到登錄之前的頁面,整個過程中如果實現不好就可能導致一些安全問題,特定條件下可能引起嚴重的安全漏洞。2.成因對於URL跳轉的實現一般會有幾

LAMP原理架構解析()LAMP編譯安裝

mariadbCentos7.3編譯安裝LAMP目錄:編譯環境LAMP編譯安裝一.環境準備 征信數據庫數據事件不一致導致數據(RAC集群)混亂,PLSQL查詢時間和數據庫時間不一致,嚴重影響業務本文出自 “每天進步一點點,自律” 博客,請務必保留此出處http://wbxue.blog.51cto.

nginx url 二級目錄

nginx url跳轉www.baidu.com/auth/a.html 跳轉到 www.badiu.com/a.html location ^~ /auth/ { rewrite ^/auth/(.*)$ https://www.baidu.

秒後

n) out HA PE ride over ams lag delayed private Handler mHandler = new Handler(new Handler.Callback() { @Override public boo

tp5中,模板、控制器、js的url方法

false header type 控制 lang dex RM ext TP $this->redirect(‘/Supperman/outerMan‘);$this->display(‘Supperman:outerMan‘);這兩者都只是在當前頁面打開新的

種ViewController的異同

沒有 PE addchild elf ase 事情 控制器 warning 優點 - (void)presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag co

[Doctrine Migrations] 數據庫遷移組件的深入解析自定義數據字段類型

con 組件 extends arr TP value ctr ets field 自定義type 根據官方文檔,新建TinyIntType類,集成Type,並重寫getName,getSqlDeclaration,convertToPHPValue,getBindingT

nginx通過url到另外的一個url

cti AS pass oot process url跳轉 .html body lis #user nobody;worker_processes 1; events {worker_connections 1024;} http {sendfile

HTTP網路請求GSON解析網路不可用到設定

//1主 mainactivity介面 package com.example.guoxinyu20181101; import android.annotation.SuppressLint; import android.content.DialogInterface; import

URL漏洞

URL跳轉漏洞 什麼是URL跳轉 利用方法 進階 防禦 什麼是URL跳轉 藉助未認證的URL跳轉,將應用程式引導到不安全的第三方區域,從而導致的安全問題。 利用方法 Header頭跳轉:通過設定Location進行跳轉

js獲取url 中的值,並相應頁面

實現方法:一:獲取URL帶QUESTRING引數的JAVASCRIPT客戶端解決方案,相當於asp的request.querystring,PHP的$_GET1.函式:<Script language="javascript">function GetRequest() {var url = lo

邊學邊敲邊記之爬蟲系列()url去重策略及實現

一、前言 今天給大家分享的是,Python爬蟲裡url去重策略及實現。 二、url去重及策略簡介 1.url去重     從字面上理解,url去重即去除重複的url,在爬蟲中就是去除已經爬取過的url,避免重複爬取,既影響爬蟲效率,又產生冗

tp5 url沒有index.php的問題

問題出在public資料夾下的.htaccess檔案上 1,首先把..htaccess檔案放在和index.php入口檔案相同的路徑層級下 2,修改.htaccess檔案內容為: <IfModule mod_rewrite.c> Options +FollowSyml