需求:使用自己开发的桌面 app 作为默认,不再出现桌面选择
在不修改源码前提下,可以设置自己的app为桌面,但是如果自己的应用出现崩溃,则在 Android 启动机制下会弹出桌面选择弹窗,如果在定制的系统中,这个是不能接受的,但本身在开发也需要使用默认 launcher 进行其他的一些设置,所以需要保留多个桌面启动器。
1、解决思路
在没有自己的启动器时候,由系统自己处理,即弹出弹窗选择或者使用自带的 Launcher3 桌面;在自己app存在情况下,使用自身app,拒绝弹窗选择。
2、分析
从启动器弹窗我们可以知道,假如只有一个启动器的情况下,是不会出现列表选择的,直接作为默认,所以我们只需判断已安装应用是否存在我们自身的app,如果存在,则清空显示的列表,只添加我们的app进去,如果不存在,默认处理。
3、处理
修改的源码为 ResolverActivity.class
代码位置 /frameworks/base/core/java/com/android/internal/app/ResolverActivity.java
,我这里只处理 Android 7.1.2,其他版本可能存在差异,但处理逻辑是一致的。
首先定位到适配器 ResolveListAdapter
,直接在它数据更新的地方做我们的数据处理,修改的方法是 private void rebuildList()
(重建数据源),修改如下:
private void rebuildList() {
//··· 省略代码
// Clear the value of mOtherProfile from previous call.
mOtherProfile = null;
mDisplayList.clear();
//第一次进来一定是null,可以看 onCreate 的调用
if (mBaseResolveList != null) {
currentResolveList = mOrigResolveList = new ArrayList<>()