Support v4 包中,雞肋的 AppLaunchChecker

版權聲明:

本賬號發布文章均來自公眾號,承香墨影(cxmyDev),版權歸承香墨影所有。

未經允許,不得轉載。

一、前言

Android Support v4 一直作為一個向下兼容的庫而存在,而從 23.3.0 開始,增加了一個 AppLaunchChecker 的類,用于判定當前的 App 是否被用戶從桌面啟動過。

這樣一個功能,有點略顯雞肋,不過不影響我們去了解它。

二、AppLaunchChecker

1.1 存在的意義

看 Api Doc ,AppLaunchChecker 就是為了檢查當前 App 是否被用戶啟動過,是一個用戶行為。

第一次看到這樣的解釋,可能會有歧義,如果 App 能做這樣的檢測,就說明當前處于運行階段,所以很難想像這樣的一個判斷的意義在哪里。

而實際上,有一些 App ,是會提供一些其他服務給別的 App 使用的,例如最常見的系統相冊的 App ,其他 App 是可以調用它來選擇圖片的,而無需從桌面去啟動它,但是它的代碼卻被運行過。

AppLaunchChecker 就是為了做這種區分,標記是否有一個以用戶行為為出發點,啟動了你的 App。

1.2 它的 Api

AppLaunchChecker 的功能非常的簡單,所以它的 Api 也相對簡單。

它提供了一個 onActivityCreate() 的方法,供啟動的 Activity 在 onCreate() 的時候調用,主要用于檢測是否由用戶從 Launcher App 中啟動,又提供了一個 hasStartedFromLauncher() 方法來獲取檢測的結果。

這實際上也沒什么好說的,既然這么簡單,那我們進去看看它的實現原理。

先來看看 onActivityCreate() 的實現。

可以看到,它的原理就是通過啟動 Activity 的 Intent 中的 ActionCategory 來區分,這個看看代碼就能知道,沒什么好說的。

最終會把判斷的結果,存入 SharedPreferences 中,name 和 key 都在 AppLauncherChecker 中定義好了。

最終,需要在我們需要判斷的時候,調用 hasStartedFromLauncher() 方法即可。

2.3 需要注意什么?

既然知道 AppLaunchChecker 的判斷原理,那么它使用的時候還是有一些需要注意的。

1、需要在 App 的入口 Activity 中,調用 onActivityCreate()

因為現在大部分 App 的結果是有一個 SplashActivity 來放一個啟動圖,然后再去跳轉到 MainActivity 。所以這樣的情況下,就需要在 SplashActivity 的 onCreate() 中,調用 AppLaunchChecker.onActivityCreate() ,之后就可以在需要的地方去獲取結果了。而在 MainActivity 中去檢測的話,它的 Action 和 Category 都將是不正確的。

2、它只能判斷是否曾經啟動過

AppLaunchChecker.onActivityCreate() 方法,只有存儲狀態的,一旦存儲將不會去修改它,所以只要有一次是用戶啟動的,通過 hasStartedFromLauncher() 方法獲取到的值將永遠是 true 。

3、它真的不準

既然它是通過 Action 和 Category 去做的判斷,實際上這是不嚴謹的。只要是個 App ,通過 PackageManager 去啟動你的 App ,它的 Action 和 Category 其實都是符合這里的判斷條件的。

只要有 App 通過這樣的方式啟動,AppLaunchChecker 就會人為是用戶行為。

看看 ApplicationPackageManager 中的實現,確實也是這樣的。

三、結語

到這里就基本上明白了 AppLaunchChecker 的原理了,有一些人覺得它的值沒有修改的時機,然后對 AppLaunchChecker 進行修改的邏輯,想在判斷的地方加個 else ,修改它為 false。

現在看來,實際上這樣的修改完全沒有意義,通過正常走 PackageManager.getLaunchIntentForPackage() 去調起,必然會判斷是用戶啟動的,否者也啟動不起來。

AppLaunchChecker 現在看來確實挺雞肋的,它有什么使用場景,就只能發揮想象力了。

公眾號二維碼.jpg
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,373評論 25 708
  • ¥開啟¥ 【iAPP實現進入界面執行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 6,535評論 0 17
  • 哀傷,煎熬,絕望。 經過不斷的反省, 我徹底無路可走了, 這個夜,我進入了生命的暗夜。 我哀傷,我不知道如何才能喜...
    j_haven閱讀 301評論 0 2
  • 一夜北風,早起又感受到幾十年前熟悉氣息(這么寫似乎暴露年齡,tmd,一大老爺們兒怕啥暴露年齡),滿地的落葉,增...
    和自己賽跑的蝸牛閱讀 484評論 6 10
  • 1.雪山小屋·四角游戲 一個小鎮子旁邊有一座雪山,據老年人講,雪山里埋著神明的寶藏。有一天,四個小孩一起去雪山上探...
    白月櫻閱讀 525評論 0 1