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

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

移動(dòng)開發(fā) Android
簡單的對(duì) Intent 進(jìn)行傳遞,可以從后端服務(wù)器拿到一個(gè) IntentUri ,這樣就無需給每個(gè)點(diǎn)擊設(shè)定好既定的打開頁面了。當(dāng)然,怎么用還是要看實(shí)際的使用場景了。

[[207121]]

 一、真的需要 new 一個(gè) Intent 嗎?

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

那么,如果想根據(jù)數(shù)據(jù)來確定跳轉(zhuǎn)的頁面呢?

需要怎么做比較好一點(diǎn)。DeepLink 好像是一個(gè)不錯(cuò)的解決方案,在 AndroidManifest.xml 中,定義好 data 字段,標(biāo)記好 scheme 、 host 等等,然后按照規(guī)則進(jìn)行傳遞,這樣也可以跳轉(zhuǎn)到某些頁面。

但是,這樣真的方便嗎?

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

那么還有別的方案嗎?

二、Intent的toUri()

直到我發(fā)現(xiàn) Intent 居然有個(gè) toUri() 的方法,我就覺得有辦法對(duì) Intent 進(jìn)行簡單的序列化了。

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

那么文章開頭的地方,那個(gè) startActivity ,最終轉(zhuǎn)換成 URI ,是什么呢?

仔細(xì)看,flag、compoent、putExtra 的數(shù)據(jù),都被序列化成一個(gè)字符串了。

得到的這個(gè) Uri ,如何使用呢?可以借助 Intent 的一個(gè)靜態(tài)方法,parseUri() 將一個(gè) Intent 的 URI ,轉(zhuǎn)換成實(shí)際的 Intent 對(duì)象。

這樣的話,其實(shí)下面的方式,同樣也會(huì)調(diào)起TwoActivity,并且?guī)н^去一個(gè) balabala 的 ID 數(shù)據(jù)。

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

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

來看看 toUri() 的具體實(shí)現(xiàn)。

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

四、會(huì)有什么隱患嗎?

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

從傳遞參數(shù)的方向看,toUriInner() 方法是toUri() 方法中,對(duì)傳遞的數(shù)據(jù)進(jìn)行序列化的方法。下面看看具體實(shí)現(xiàn)。

可以看到, toUriInner() 方法,它對(duì)基本的數(shù)據(jù)類型,都有對(duì)應(yīng)的類型進(jìn)行轉(zhuǎn)換,例如之前S.id=balabala 表示一個(gè) key 為 id 的 String 類型的值 balabala 。

好像已經(jīng)涵蓋了所有的類型傳參了,可是并不是這么美好。發(fā)現(xiàn)沒有,沒有關(guān)于 Bundle 的參數(shù)傳遞,難道是看漏了嗎?

代碼也不看了,做個(gè)試驗(yàn)驗(yàn)證一下。

看看 Log 輸出:

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

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

實(shí)際使用中,就需要我們對(duì)傳遞的參數(shù)有嚴(yán)格的要求,避免使用 Bundle 去傳遞數(shù)據(jù),當(dāng)然我們也可以自己去是實(shí)現(xiàn)序列化和反序列化 Bundle 的邏輯。

五、結(jié)語

這樣就可以簡單的對(duì) Intent 進(jìn)行傳遞,可以從后端服務(wù)器拿到一個(gè) IntentUri ,這樣就無需給每個(gè)點(diǎn)擊設(shè)定好既定的打開頁面了。當(dāng)然,怎么用還是要看實(shí)際的使用場景了。

【本文為51CTO專欄作者“張旸”的原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)通過微信公眾號(hào)聯(lián)系作者獲取授權(quán)】

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

責(zé)任編輯:武曉燕 來源: 51CTO專欄
相關(guān)推薦

2017-10-13 16:55:12

Android

2012-06-08 13:47:32

Wndows 8Vista

2023-04-05 14:19:07

FlinkRedisNoSQL

2014-08-11 09:44:40

Wi-Fi802.11ax

2023-11-01 08:20:51

Intent數(shù)據(jù)傳遞對(duì)象

2013-12-17 09:02:03

Python調(diào)試

2013-12-31 09:19:23

Python調(diào)試

2022-12-21 15:56:23

代碼文檔工具

2023-05-23 13:59:41

RustPython程序

2017-06-23 08:18:17

2013-08-22 10:17:51

Google大數(shù)據(jù)業(yè)務(wù)價(jià)值

2021-05-20 08:37:32

multiprocesPython線程

2015-03-16 12:50:44

2022-08-06 08:41:18

序列化反序列化Hessian

2015-02-05 13:27:02

移動(dòng)開發(fā)模塊SDK

2011-01-18 10:45:16

喬布斯

2015-10-08 17:04:57

VR普及手機(jī)

2017-07-28 09:39:12

隱式IntentAndroid M

2021-12-14 19:40:07

Node路由Vue

2021-09-07 10:29:11

JavaScript模塊CSS
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 97日日碰人人模人人澡分享吧 | 亚洲国产精品久久久久婷婷老年 | 免费v片| 久久综合一区 | 免费网站国产 | 国产精品自产av一区二区三区 | 国产在线中文字幕 | 成人福利视频网站 | av一级久久 | 国产精品久久久久久久久久久久久 | 久久久这里只有17精品 | 久久久一区二区 | 欧美日韩综合视频 | 精品久久久久久亚洲综合网 | 亚洲国产精品一区二区久久 | 九九热在线视频免费观看 | 国产在线资源 | 黄a免费看 | 国产精品成人国产乱 | 一区二区三区在线电影 | 全免费a级毛片免费看视频免 | 欧美久久久久久久久 | 国产色播av在线 | 天天躁日日躁狠狠躁白人 | 久久久精品视频免费看 | 99re6在线视频 | av网站在线播放 | 久久久久一区二区三区 | 在线播放中文 | 久草综合在线 | 久久精品在线 | 午夜久草 | 真人女人一级毛片免费播放 | 亚洲一区在线免费观看 | 久久日韩精品一区二区三区 | 一级做a爰片性色毛片16 | 瑞克和莫蒂第五季在线观看 | 色视频在线免费观看 | 国产乱码精品一区二三赶尸艳谈 | 五月婷婷视频 | 亚洲视频免费在线看 |