1. 程式人生 > >ANDROID HTML重定向之後返回原生view處理

ANDROID HTML重定向之後返回原生view處理

一直都在做HTML與原生混合式開發,前面遇到一個問題,我們的合作企業,合入我們的APP之後,出現頁面跳轉頁面死迴圈的問題。

1.下面是我們APP裝載HTML後頁面的邏輯||原理

這裡把

合作公司的HTML簡稱[yiju_html],

我們裝載的webview中的html叫做 [webview_html]

合作公司的返回前面一個頁面叫做 yiju_back()

我們app中的返回圖示原生[webview_back()]

html history 返回簽名一個頁面繼history.back(-1) || history.go(-1)簡稱[back()]

這樣我們就有了如下的邏輯

如果沒有重定向,就有

if(yiju_back()==back()){
   webview_back()=yiju_back()=back();
   //這是一種完全按照history來的
}else{
   webview_back()=back();
   yiju_back()!=back();
   //這裡合作公司的跳轉就完全按照自己的邏輯走了
   //但是自己的返回button處理就按照歷史記錄history處理
}

當然現在很多的大的企業還是,按照很嚴格的history的處理的,但是也不乏有重定向的出現如何處理呢

2.什麼是HTML重定向

應為本人對於定義的理解還是很模糊的,顧save了下,html重定向的定義,下面的定義來自於百度詞條

html重定向就是通過各種的方法將各種網路請求重新定個方向轉到其它位置。 在網站建設中,時常會遇到需要網頁重定向的情況:象網站調整,如改變網頁目錄結構,網頁被移到一個新地址,再或者,網頁副檔名改變,如因應用需要把。php改成。Html或。shtml,在這種情況下,如果不做重定向,則使用者收藏夾或搜尋引擎資料庫中舊地址只能讓訪問客戶還會得到一個404頁面錯誤資訊,訪問流量白白喪失;再如某些註冊了多個域名的網站,也需要通過重定向讓訪問這些域名的使用者自動跳轉到主站點,等等。

3.正常開啟 和非正常開啟跳轉頁面日誌分析

更具仔細研究重定向和非重定向頁面的跳轉,發現,問題所在,在於重定向的頁面,點選返回按鈕之後,非重定向頁面會再次載入一次,顧出現多次呼叫,變成死迴圈

4.如何解決3的問題

根據,上條的分析,我們知道需要避免的就是載入重定向頁面之後,費重定向頁面重新載入,顧需要避免,顧有了下面的邏輯

1)定義一個集合用來裝載跳轉歷史url

2)url加入集合,記錄非重定向連結, 避免重新整理HTML引發多次加入集合,和獲取到的goLastPage()錯誤

3)url加入集合,記錄重定向連結,重定向連結和之前頁面一定不同,顧加入集合資料

4)返回方法,獲取簽名一個頁面,並且載入url

這裡相當於自己記載了頁面跳轉邏輯,通過自己的記錄資料,進行跳轉頁面,從而達到頁面跳轉正常

5.程式碼實現

package 包名;

import android.graphics.Bitmap;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.KeyEvent;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import com.ali.auth.third.core.util.StringUtil;
import com.reach.doooly.R;
import java.util.Stack;

public class TestActivity extends AppCompatActivity {

    private WebView webview;
    private MyWebViewClient webViewClient;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.webview_layout);
        webview = (WebView) findViewById(R.id.view_webview);
        webViewClient = new MyWebViewClient();
        webview.getSettings().setJavaScriptEnabled(true);
        webview.setWebViewClient(webViewClient);
        webview.loadUrl("地址");
    }


    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        return pageGoBack(webview,webViewClient);
    }

    public boolean pageGoBack(WebView web, MyWebViewClient client) {
        final String url = client.popLastPageUrl();
        if (url != null) {
            web.loadUrl(url);
            return true;
        }
        finish();
        return false;
    }

    class MyWebViewClient extends WebViewClient {
        /**
         * 記錄URL的棧
         */
        private final Stack<String> mUrls = new Stack<>();
        /**
         * 判斷頁面是否載入完成
         */
        private boolean mIsLoading;
        private String mUrlBeforeRedirect;

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            super.onPageStarted(view, url, favicon);
            if (mIsLoading && mUrls.size() > 0) {
                mUrlBeforeRedirect = mUrls.pop();
            }
            recordUrl(url);
            this.mIsLoading = true;
        }

        /**
         * 記錄非重定向連結, 避免重新整理頁面造成的重複入棧
         *
         * @param url 連結
         */
        private void recordUrl(String url) {
            //這裡還可以根據自身業務來遮蔽一些連結被放入URL棧
            if (!StringUtil.isEmpty(url) && !url.equalsIgnoreCase(getLastPageUrl())) {
                mUrls.push(url);
            } else if (!StringUtil.isEmpty(mUrlBeforeRedirect)) {
                mUrls.push(mUrlBeforeRedirect);
                mUrlBeforeRedirect = null;
            }
        }

        /**
         * 獲取上一頁的連結
         **/
        private synchronized String getLastPageUrl() {
            return mUrls.size() > 0 ? mUrls.peek() : null;
        }

        /**
         * 推出上一頁連結
         */
        public String popLastPageUrl() {
            if (mUrls.size() >= 2) {
                mUrls.pop(); //當前url
                return mUrls.pop();
            }
            return null;
        }

        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            if (this.mIsLoading) {
                this.mIsLoading = false;
            }
        }
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            return false;
        }
    }
}

經過測試這樣就可以了,返回按鈕的事件只需要把這裡的選擇物理鍵返回的處理,add入我們自己寫的頭部,返回button事件處理裡面就可以了歐。

希望該文章對你我有用

相關推薦

ANDROID HTML定向之後返回原生view處理

一直都在做HTML與原生混合式開發,前面遇到一個問題,我們的合作企業,合入我們的APP之後,出現頁面跳轉頁面死迴圈的問題。 1.下面是我們APP裝載HTML後頁面的邏輯||原理 這裡把 合作公司的HTML簡稱[yiju_html], 我們裝載

Exchange使用HTML定向

新建 fff start image alt 瀏覽器 要求 重定向 tar 新建index.html文件寫入以下內容:<meta HTTP-EQUIV=REFRESH CONTENT="0; URL=https://mail.it.com/owa">

使用curl庫獲取定向之後的url

示例程式碼如下: #include<iostream> #include<string> using namespace std; #pragma comment(lib,

關於定向之後session丟失的問題

今天在資料庫取值存到list集合,在Servlet將list存到session裡之後,重定向到專案下的另外一個頁面,發現session裡面的內容丟失。 測試:在Servlet中列印list,發現list的值都在,重定向之後,跳轉的頁面讀取到session為Null, 於是確定是重定向引起的session丟失

(微信公眾號)頁面定向之後的回退問題

簡單介紹 window 的兩個常用 api window.document.location.replace window.document.location.href 通常如果我們需要跳轉頁面,如果沒有使用 vue-router 等路由的話,我們都會選擇 l

nginx rewrite(301)定向之後無法正常請求的解決方案

前言 問題追蹤 總結 前言 前面通過騰訊雲ssl證書實現了https的請求,如果想

在Fragment中重寫返回鍵以及WebView載入定向頁面返回問題

首先我是實現一個PagerView的頁面滑動效果,並在裡面添加了兩個Fragment當作子頁面。其中一個Fragment中使用WebView顯示網頁。 於是遇到了這樣的問題:  1、使用網頁的時候,從一個頁面跳到另一個頁面,當想返回上一個頁面時,點選返回按鈕,應用直接就退出

Android WebView定向問題的解決方案

當WebView在載入網頁時,有時會有重定向問題,返回鍵回退怎麼也回退不掉,怎麼辦? WebView有一個getHitTestResult():返回的是一個HitTestResult,一般會根據開啟的連結的型別,返回一個extra的資訊,如果開啟連結不是一個url,或者開啟的連結是JavaScript的ur

HttpClient獲取定向之後的網址資訊

package com.jadyer.httpclient; import org.apache.http.HttpEntity; import org.apache.http.HttpHost; import org.apache.http.HttpRespons

用.net獲取定向之後的地址

Response.redirect 重定向就是向客戶端的瀏覽器傳送一個特殊的HTTP報頭:HTTP/1.1  302  Object  Moved Location http://redirecturl瀏覽器讀到此報頭,就按Location值的指示載入頁面.所以,獲取重定向

Fiddler(3)--定向返回指定資料)

1、使用AutoResponder標籤 2、點選Add Rule按鈕,使用匹配規則   (1)勾選Enable rules:啟用規則   (2)勾選unmatched requestspassthrough:不匹配規則的就按照之前的請求地址傳送過去   (3)選擇規則,在r

apache httpclient 獲取定向之後的url方法

    public static void main(String[] args)     {         CloseableHttpClient httpclient = null;         CloseableHttpResponse response =

微信連結定向之後後退兩次才能退出當前頁面問題解決

需求:微信內多個H5頁面分享出去指定到同一連結 頁面重定向之後發現在微信裡點選後退之後,又會重新返回這個頁面,必須要連續快速的點選返回才能退出關閉瀏覽器, 這個使用者體驗就非常不好, 我們可以手動給瀏覽器新加一條空的瀏覽記錄‘#’, 然後監控這個#連結,當返回到這個連結

Android進階---Android Webview定向問題解決

專案中需要webview重定向,但是由於一個webveiw裡面有許多載入操作,因此在呼叫webview。goback()方法時,往往達不到我們需要的操作效果。 1.解決方法 WebBackForwardList webBackForwardList=we

SpringMVC第三篇【收集引數、字串轉日期、結果定向返回JSON】

業務方法收集引數 我們在Struts2中收集web端帶過來的引數是在控制器中定義成員變數,該成員變數的名字與web端帶過來的名稱是要一致的…並且,給出該成員變數的set方法,那麼Struts2的攔截器就會幫我們自動把web端帶過來的引數賦值給我們的成員變數….

springmvc 處理器方法返回的是modelandview 定向到頁面

ima src log images 1-1 分享 .cn png mage springmvc 處理器方法返回的是modelandview 重定向到頁面

[Android FrameWork 6.0源碼學習] View繪過程

nds 源碼學習 most leg shift isp window round ces View繪制的三部曲, 測量,布局,繪畫今天我們分析測量過程 view的測量是從ViewRootImpl發起的,View需要重繪,都是發送請求給ViewRootImpl,然後他組織重

[Android FrameWork 6.0源碼學習] View繪過程之Layout

種子 noop cond req cor ide boolean 需要 bound View繪制的三部曲,測量,布局,繪畫現在我們分析布局部分測量部分在上篇文章中已經分析過了。不了解的可以去我的博客裏找一下View的布局和測量一樣,都是從ViewRootImpl中發起,Vi

[Android FrameWork 6.0源碼學習] View繪過程之Draw

鐘表 store 傳遞 lan play deb kill gre 學習 View繪制的三部曲,測量,布局,繪畫現在我們分析繪畫部分測量和布局 在前兩篇文章中已經分析過了。不了解的可以去我的博客裏找一下 下面進入正題,開始分析調用以及函數原理 private void

MVC控制器返回定向操作

sha user viewdata 操作 service dir () return pre Return Redirect();方法 public ActionResult DeleteUser(int id) {