了解-Launcher

*********************本文提出的问题*************************

Launcher 启动入口在哪?

系统如何识别 Launcher 应用?

如何开发一个桌面 Launcher 应用?

Launcher 启动入口在哪?

当系统服务启动完成之后,SystemServer.Java 的 startOtherServces() 里面会调用 activityManangerService.systemReady() 方法,这就是 Launcher 的启动入口.

SystemServer

而在 ActivityManangerService.java 类里的 systemReady()  内部有一个重要的方法 startHomeOnAllDisplays

ActivityManangerService

这个是 ActivityTaskManagerInternal.Java 类里面的方法

ActivityTaskManagerInternal

由注释可知这个方法为再所有的屏幕上(多屏幕)启动 Launcher 应用,在 Android 10.0 之后把 activity 相关的启动工作都转移到了 ActivityTaskManagerService 类中,而 ActivityTaskManagerInternal 是面向接口的一个抽象类,framework里有很多这种 Internal 类.所以去寻找实现类很费劲,一般情况下 Internal 类的实现类都在对应类的 LoaclService中,所以去 ActivityTaskManagerService&LoaclService 中寻找

ActivityTaskManagerService&LoaclService

可以看到它继承了 ActivityTaskManagerInternal

LoaclService

在 startHomeOnAllDispalys() 中又把启动桌面应用的工作委托给了 RootWindowContainer,跟进一下,可以看到他遍历了所有屏幕,然后取出id,依次调用 startHomeOnDisplay(),也就是依次在屏幕上启动桌面应用

RootWindowContainer

再次跟进 startHomeOnDisplay()

RootWindowContainer.startHomeOnDisplay

又遍历了一遍,留个疑问吧.-----------------------

系统如何识别 Launcher 应用?

跟进 startHomeOnTaskDisplayArea(); 里面有个重点, getHomeIntent();

startHomeOnTaskDisplayArea

可以看到这个 intent.addCategory 的参数为 CATEGORY_HOME 跟我们平时用的 CATEGORY_LAUNCHER 不同.这个就是区别,设置为 HOME 就是 launcher 应用,怪怪的

getHomeIntent

如何开发一个桌面 Launcher 应用?

只需要在 AndroidManifest 里面添加两条属性就可以了

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容