成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

將Intent序列化,像Uri一樣傳遞Intent!!!

移動開發 Android
簡單的對 Intent 進行傳遞,可以從后端服務器拿到一個 IntentUri ,這樣就無需給每個點擊設定好既定的打開頁面了。當然,怎么用還是要看實際的使用場景了。

[[207121]]

 一、真的需要 new 一個 Intent 嗎?

在 Android 中,打開一個 Activity ,有多少種方式?不過不管是使用什么方式,最終都沒辦法逃避創建一個 Intent ,然后startActivity()。

那么,如果想根據數據來確定跳轉的頁面呢?

需要怎么做比較好一點。DeepLink 好像是一個不錯的解決方案,在 AndroidManifest.xml 中,定義好 data 字段,標記好 scheme 、 host 等等,然后按照規則進行傳遞,這樣也可以跳轉到某些頁面。

但是,這樣真的方便嗎?

我們需要在每個需要跳轉的 Activity 上,設定好data?當然,現在 Github 上也有一些成熟的 Deeplink 的解決方案,只需要在為某個 Activity 設定 data ,然后所有 deeplink 的鏈接都跳轉到這個 Activity 上,***再由這個RouterActivity,去決定向那里跳轉,并攜帶上參數。

那么還有別的方案嗎?

二、Intent的toUri()

直到我發現 Intent 居然有個 toUri() 的方法,我就覺得有辦法對 Intent 進行簡單的序列化了。

從文檔中可以看出,toUri() 方法可以將一個 Intent 轉換成一個 URI ,其中包含了 action、categories、flags 等一些必要的參數。

那么文章開頭的地方,那個 startActivity ,最終轉換成 URI ,是什么呢?

仔細看,flag、compoent、putExtra 的數據,都被序列化成一個字符串了。

得到的這個 Uri ,如何使用呢?可以借助 Intent 的一個靜態方法,parseUri() 將一個 Intent 的 URI ,轉換成實際的 Intent 對象。

這樣的話,其實下面的方式,同樣也會調起TwoActivity,并且帶過去一個 balabala 的 ID 數據。

到這里,基本上把本篇文章需要講解的內容都講明白了。但是有追求的程序員,我們還是要深挖一下,toUri() 到底干了些什么?

三、toUri()到底干了什么?

來看看 toUri() 的具體實現。

從源碼的實現看,其實 toUri() 只是把每個字段讀取出來,然后按照規則進行序列化,*** parseUri() 只是按照這個規則進行了反序列化。熟練的話,基本上無需使用 toUri() 這個方法轉換,就可以盲寫 Intent 的 URI。

四、會有什么隱患嗎?

我們使用的 API 都是官方對 Intent 提供的,用起來好像也確實沒有什么問題。但是真的像看上去那么美好嗎?

從傳遞參數的方向看,toUriInner() 方法是toUri() 方法中,對傳遞的數據進行序列化的方法。下面看看具體實現。

可以看到, toUriInner() 方法,它對基本的數據類型,都有對應的類型進行轉換,例如之前S.id=balabala 表示一個 key 為 id 的 String 類型的值 balabala 。

好像已經涵蓋了所有的類型傳參了,可是并不是這么美好。發現沒有,沒有關于 Bundle 的參數傳遞,難道是看漏了嗎?

代碼也不看了,做個試驗驗證一下。

看看 Log 輸出:

可以看到,toUri() 這個方法,確實對 Bundle 參數的序列化并沒有做特殊處理。

得到的結論,就是雖然 toUri() 和 parseUri() 方法確實很好用,但是也是有缺陷的,Bundle 傳遞的數據沒法序列化成 Uri。

實際使用中,就需要我們對傳遞的參數有嚴格的要求,避免使用 Bundle 去傳遞數據,當然我們也可以自己去是實現序列化和反序列化 Bundle 的邏輯。

五、結語

這樣就可以簡單的對 Intent 進行傳遞,可以從后端服務器拿到一個 IntentUri ,這樣就無需給每個點擊設定好既定的打開頁面了。當然,怎么用還是要看實際的使用場景了。

【本文為51CTO專欄作者“張旸”的原創稿件,轉載請通過微信公眾號聯系作者獲取授權】

戳這里,看該作者更多好文

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2017-10-13 16:55:12

Android

2012-06-08 13:47:32

Wndows 8Vista

2023-04-05 14:19:07

FlinkRedisNoSQL

2023-11-01 08:20:51

Intent數據傳遞對象

2014-08-11 09:44:40

Wi-Fi802.11ax

2023-05-23 13:59:41

RustPython程序

2013-12-31 09:19:23

Python調試

2013-12-17 09:02:03

Python調試

2022-12-21 15:56:23

代碼文檔工具

2017-06-23 08:18:17

2021-05-20 08:37:32

multiprocesPython線程

2013-08-22 10:17:51

Google大數據業務價值

2015-03-16 12:50:44

2022-08-06 08:41:18

序列化反序列化Hessian

2015-02-05 13:27:02

移動開發模塊SDK

2011-01-18 10:45:16

喬布斯

2015-10-08 17:04:57

VR普及手機

2017-07-28 09:39:12

隱式IntentAndroid M

2012-03-21 10:15:48

RIM越獄

2017-05-22 10:33:14

PythonJuliaCython
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文字幕 国产精品 | 日韩免费一区二区 | 久久99这里只有精品 | 91精品导航 | 亚洲精品乱码久久久久久蜜桃91 | 国产免费观看久久黄av片涩av | 日韩一级一区 | 国产99免费 | 国产在线精品一区二区三区 | 国产亚洲一区二区精品 | 国产成人精品一区二区三区在线观看 | 欧美一级一区 | 日韩一区二区三区四区五区 | 一级黄a视频 | 欧美日韩在线精品 | 久久一二三区 | 日韩精品一区二区三区在线观看 | 国产精品一卡二卡三卡 | 99久久精品国产一区二区三区 | 久久精品免费观看 | 国产一区精品在线 | 国产精品久久国产精品99 gif | 国产成人精品免费 | 日韩无 | 精品国产一区二区三区久久久四川 | 欧美日韩亚洲国产综合 | 91视频中文 | 国产91视频播放 | 亚洲人成人网 | 久久人人爽人人爽人人片av免费 | 国产精品久久久久久久久久三级 | 久久久精品一区 | 99色播| 免费在线看黄视频 | 国产午夜精品一区二区三区四区 | 亚洲精品字幕 | 欧美精品久久久久 | 亚洲视频免费观看 | 一区二区在线不卡 | 综合色久 | 日韩电影在线一区 |