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

使用 Router 實現的模塊化,如何優雅的回到主頁面

開發 開發工具
一般而言,這種 Router 的方案,從外部直接調起的方式,是由一個 ProxyActivity 做一個代理,然后再由它去跳轉到項目內的其他目標 TargetActivity 。這樣的實現,理論上,是可以從外部調起 App 內所有的 Activity 的。

 [[198664]]

一、前言

現在越來越多的 App 以 Router 路由的形式,來實現模塊化。一般而言,這種 Router 的方案,從外部直接調起的方式,是由一個 ProxyActivity 做一個代理,然后再由它去跳轉到項目內的其他目標 TargetActivity 。這樣的實現,理論上,是可以從外部調起 App 內所有的 Activity 的。

但是這樣就面臨一個問題,如果從外部調起了一個子頁的 Activity,舉例是一個影片詳情頁,如果想在用戶回退的時候,進入到應用主頁,而非直接退出了。就需要特殊處理了。

本文就以如何優化的回退到我們需要的 Activity 來做一個說明。

二、分析和拆解問題

對于前面舉例的情況來說,實際上我們只需要處理好以下問題即可。

  1. 如何區分當前 Activity 是從應用內打開,還是從應用外直接打開,就是打開 Activity 的來源。
  2. 在區分出來 Activity 打開的來源之后,如何優雅的退回到我們需要的 Activity。
  3. 要處理一些特殊情況。

對于這樣幾個問題,區分來源,最粗暴的方式,就是在 Intent 里增加一個類似 from 的字段,來標記是從那個頁面過來的,如果不是我們指定的話,在 finish() 或者 onBackPressed() 的時候,就打開 MainActivity 即可。

這是一個粗暴的方式,雖然它有用,可它不夠優雅。

而在 Support v4 22.0.0 開始,針對這樣的情況,為我們增加了一個 NavUtils 的類,專門用于處理這種情況,接下來就來看看如何使用它。

三、NavUtils 如何使用

NavUtils 從名稱上就可以看出來,它是一個用于處理導航的輔助工具類。

先來看看它的方法,它主要的方法主要分三中:

  • getParentActivityIntent():獲得一個用戶回退到父Activity 的Intent。
  • shouldUpRecreateTask():是否需要重新構建一個 Task。
  • navigateUpTo():回退到 Intent 指定的父 Activity。

為了方便使用 getParentActivityIntent() 提供了很多的重載,但是實際上目的都是一樣的,就是拿到我們指定的當前 Activity 的上一級 Activity(父 Activity )。

既然是 Support v4 包下的輔助類,它其實在內部也是做好了很多兼容的處理。它針對不同的 Android Level 做了不同的實現,可以看到 NavUtilsImplBase 和 NavUtilsImplJB 都是為了處理兼容性的問題,他們都實現了 NavUtilsImpl 接口,而且在靜態代碼塊內處理好了兼容性問題。

好了,源碼就先聊到這里,先來看看如何使用。

如果想要使用 NavUtils 還需要在 AndroidManifest.xml 中,為 Activity 指定一個父的 Activity。

這里有個 Demo ,有兩個 Activity,分別是 MainActivity 和 ChildActivity 。我們需要對 ChildActivity 設定父 Activity。

為 Activity 設定父 Activity,是需要區分版本的,在 4.1 之后,是可以使用 android:parentActivityName 直接指定即可。而對于 4.0 及一下的版本,如果想要使用,可以配置 meta-data 標簽,name 必須是 android.support.PARENT_ACTIVITY 而 value 就是用來指定父 Activity 的。

先來看看官方推薦的使用示例。

它的流程非常的簡單,首先使用 NavUtils.getParentActivityIntent() 方法,獲得它的父 Activity,然后使用 NavUtils.shouldUpRecreateTask() 方法,確定當前 Activity 是否需要一個 Task ,如果需要,使用 TaskStackBuilder 來操作,如果不需要就直接調用 NavUtils.navigateUpTo() 方法來繼續接下去的邏輯。

可以看到這一套邏輯,非常的簡單,如果按照文檔的描述,使用起來應該體驗挺不錯的,但是它有坑,后面講。

三、NavUtils 的源碼

先來看看 NavUtilsImplBase 這個 Api Level 16 以下的 Api 實現,它因為沒有一些高版本的 Api,從源碼上能看出跟多細節。

簡單關注一下它的細節,shouldUpRecreateTask() 方法,實際上是通過校驗 Action 是否等于ACTION_MAIN 來確定的,而 navigateUpTo() 只是為 upIntent 添加了FLAG_ACTIVITY_CLEAR_TOP 這個 flag ,然后啟動父 Activity 并且關閉自己。而 getParentActivityIntent() 的代碼,其實核心還是在 NavUtils.getParentActivityName(),最終可以看到,它和我們配置的一樣,是從 meta-data 中獲取的數據。

再來看看 NavTilsImplJB 這個 Api Level 16 上的實現。

可以看到,它其實很多邏輯都放在 NavUtilsJB 這個類中。

而它實際上很多方法都是直接調用的 Activity 中對應的方法,有興趣可以去看看 Activity 的源碼中的實現。

四、填坑和最終實現

到這里,基本上就已經了解了 NavUtils 的實現原理了,看樣子用起來應該沒那么多問題,但是如果實際使用起來,你就會發現有坑了。

1、shouldUpRecreateTask() 永遠返回的是 false。

實際上,這并不是 shouldUpRecreateTask() 方法在實現上有什么 Bug,它實際上是給Notification 使用的,在 Notification 使用 PendingIntent 的時候,使用 TaskStackBuilder來構建它,其構造一個 Back Task ,在這里就可以使用 shouldUpRecreateTask() 方法來做判斷了。

但是大多數情況下,我們并不只是在 Notification 中使用它,并且有一些推送的消息,這個Notification 并非我們去構造的,而是由第三方 SDK 來構建的,這就導致這種情況并不符合大多數場景。

下面是官方提供的一個 Demo。

有興趣可以移步到官方文檔查看:

https://developer.android.com/guide/topics/ui/notifiers/notifications.html#NotificationResponse

所以我們可以使用 Activity.isTaskRoot() 來做輔助判斷,它是 Activity 的方法,可以判斷當前 Activity 是否是在當前 Task 的根 Activity,這樣就說明再回退的話,實際上就會將當前 Task 完整的清空,表現就是退出去了。

2、navigateUpTo() 會重新啟動MainActivity

navigateUpTo() 方法從源碼上可以看出來,它實際上是強加了一個FLAG_ACTIVITY_CLEAR_TOP ,然后重新啟動它,這樣的話,在某些設備上,默認是有動畫處理的,因為這里是打開了一個新的頁面,而非 finish() 之后,自動回退到上一個頁面的操作。

那么解決方案也非常的簡單,在判斷當前 Activity 不需要使用 TaskStackBuilder 構造一個 Task Stack ,就直接 finish() 掉當前的頁面,因為這樣的判斷說明當前 Activity 是在頁面內正常打開的,所以直接 finish() 就可以退回到上一個頁面了。

最終改動之后的實現效果就變成了這樣,AndroidManifest.xml 中的配置不變。

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

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

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

2022-09-21 11:51:26

模塊化應用

2019-01-30 14:04:57

Fedora存儲庫

2010-01-20 09:14:49

C語言模塊化

2020-09-18 09:02:32

前端模塊化

2020-09-17 10:30:21

前端模塊化組件

2021-12-16 22:02:28

webpack原理模塊化

2010-01-21 09:27:30

模塊化的優點NetBeans

2019-09-02 10:51:59

Python腳本語言程序員

2016-10-09 11:03:41

Javascript模塊化Web

2019-08-28 16:18:39

JavaScriptJS前端

2022-09-05 09:01:13

前端模塊化

2021-11-19 10:55:03

GitOps運維自動化

2024-01-17 10:16:22

前端國際化消息鍵

2023-01-31 10:29:26

JavaScript國際化國際化庫

2010-08-02 08:54:53

Flex模塊化

2010-08-13 15:48:38

Flex模塊化

2023-12-18 14:56:00

模塊化單體系統數據庫

2015-09-10 11:10:37

模塊化機房節能

2010-05-28 10:31:28

模塊化IT

2023-05-24 10:35:11

Node.jsES模塊
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品免费国产一区二区三区四区介绍 | 亚洲电影一区二区三区 | 欧美韩一区二区 | 天天av网 | 国产免费观看一级国产 | 久久精品国产一区二区三区不卡 | 欧美成人高清 | 欧美日韩国产一区 | 亚洲国产成人精品久久 | 成人免费网站 | 婷婷在线免费 | 国产成人精品a视频一区www | www.玖玖玖 | 精品综合久久久 | 欧美激情久久久 | 精品视频一区二区三区 | 国产精品久久久久久久久久 | 91精品中文字幕一区二区三区 | www.国产精 | 黄色免费观看网站 | 欧美理伦片在线播放 | 95国产精品 | 亚洲成人av| 在线观看亚洲精品 | 亚洲精品一区二区三区中文字幕 | 欧美啪啪| 日韩一区二区在线播放 | 色橹橹欧美在线观看视频高清 | 日韩午夜 | 久久精品国产一区二区三区 | av天天爽 | 国内久久| 欧美国产日韩在线观看成人 | 黑人巨大精品欧美一区二区一视频 | 欧美一级大片免费观看 | 97色在线视频| 久久久成人网 | 国产精品成人一区二区三区夜夜夜 | 国产黄色大片网站 | a欧美| 欧美一区二区在线观看 |