当前位置: 首页 > 科技观察

v4包中,鸡肋的AppLaunchChecker

时间:2023-03-12 06:05:46 科技观察

1.前言AndroidSupportv4一直是作为一个向后兼容的库存在的,但是从23.3.0开始,增加了一个AppLaunchChecker类来判断当前App是否被用户Launched从桌面。这样的功能有点鸡肋,但是不影响我们理解它。2、AppLaunchChecker1.1的含义见ApiDoc,AppLaunchChecker是检查当前App是否已经被用户启动,是一种用户行为。第一次看到这样的解释,可能会有歧义。如果App能做这种检测,就说明它目前处于运行阶段,很难想象这种判断的意义。其实还有一些APP是提供其他服务给其他APP使用的,比如最常见的系统相册APP,不需要从桌面启动它就可以被其他APP调用来选择图片,但是运行了它的代码。AppLaunchChecker就是做这个区分,标记是否有用户行为作为启动你的App的起点。1.2它的ApiAppLaunchChecker的功能很简单,所以它的Api也比较简单。提供onActivityCreate()方法供启动的Activity在onCreate()时调用,主要用于检测是否由用户从LauncherApp启动,并提供hasStartedFromLauncher()方法获取检测结果。这个其实没什么好说的。既然这么简单,那我们就进去看看它是如何工作的吧。我们先来看onActivityCreate()的实现。可见其原理是在启动Activity的Intent中区分Action和Category。这个看代码就知道了,没什么好说的。它将判断结果存储在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中的实现,确实如此。3.结束语至此,AppLaunchChecker的原理基本了解了。有人认为没有时间修改它的值,然后修改AppLaunchChecker的逻辑。他们想在判断中加一个else,修改为false。现在看来,这样的修改完全没有意义。正常调用PackageManager.getLaunchIntentForPackage()会判断是用户启动的,否则不会启动。AppLaunchChecker现在看来真的是鸡肋了,有什么使用场景,大家只能发挥想象了。【本文为专栏作家“张扬”原创稿件,转载请微信♂联系作者获得授权】点此查看作者更多好文