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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,802评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,109评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,683评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,458评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,452评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,505评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,901评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,550评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,763评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,556评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,629评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,330评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,898评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,897评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,140评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,807评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,339评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,369评论 25 707
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,344评论 0 17
  • 哀伤,煎熬,绝望。 经过不断的反省, 我彻底无路可走了, 这个夜,我进入了生命的暗夜。 我哀伤,我不知道如何才能喜...
    j_haven阅读 283评论 0 2
  • 一夜北风,早起又感受到几十年前熟悉气息(这么写似乎暴露年龄,tmd,一大老爷们儿怕啥暴露年龄),满地的落叶,增...
    和自己赛跑的蜗牛阅读 459评论 6 10
  • 1.雪山小屋·四角游戏 一个小镇子旁边有一座雪山,据老年人讲,雪山里埋着神明的宝藏。有一天,四个小孩一起去雪山上探...
    白月樱阅读 485评论 0 1