前言
android L开始launcher3对于package变化的监听发生了改变,M之前都是通过PackageChangedReceiver(PackageChangedReceiver.java)这个广播接收器来监听的。但是从L开始我们发现LauncherAppsCompat的实现类有两个:LauncherAppsCompatV16和LauncherAppsCompatVL。在LauncherAppsCompatV16中还是通过广播(PackageMonitor extends BroadcastReceiver)来监听packages变化。而在 LauncherAppsCompatVL并没有发现有广播接收器,那么它到底是如何实现packages的监听的呢?
LauncherApps的初始化
我们看到在LauncherAppsCompatVL初始化时,通过getSystemService("launcherapps")得到一个mLauncherApps的系统服务。代码如下:
LauncherAppsCompatVL(Context context) {
super();
mLauncherApps = (LauncherApps) context.getSystemService("launcherapps");
}
看到getSystemService我们可以知道mLauncherApps是一个系统服务,那这个系统服务到底是何方神圣呢?
LauncherApps.java位于frameworks/base/core/java/android/content/pm目录下,我们首先看下它的初始化。
public LauncherApps(Context context, ILauncherApps service) {
mContext = context;
mService = service;
mPm = context.getPackageManager();
}
在LauncherApps的构造方法中重要做三个初始化:上下文mContext、ILauncherApps及获取PackageManager对象。我们重点关注mService是如何实现的,它是如何做到package的监听的呢?
ILauncherApps的实现
从上文我们可以知道LauncherApps是作为客户端通过ILauncherApps获取服务端package变化状态,那么ILauncherApps这个接口定义了些什么呢,它又是如何实现对package的监听呢?我们继续往下分析,首先看下ILauncherApps定义了什么方法:
interface ILauncherApps {
void addOnAppsChangedListener(in IOnAppsChangedListener listener);
void removeOnAppsChangedListener(in IOnAppsChangedListener listener);
List getLauncherActivities(String packageName, in UserHandle user);
ResolveInfo resolveActivity(in Intent intent, in UserHandle user);
void startActivityAsUser(in ComponentName component, in Rect sourceBounds,
in Bundle opts, in UserHandle user);
void showAppDetailsAsUser(in ComponentName component, in Rect sourceBounds,
in Bundle opts, in UserHandle user);
boolean isPackageEnabled(String packageName, in UserHandle user);
boolean isActivityEnabled(in ComponentName component, in UserHandle user);
}
我们看到在这个接口中有addOnAppsChangedListener和removeOnAppsChangedListener这两个方法及其他一些方法(我们暂时不关心),我们只关心addOnAppsChangedListener和removeOnAppsChangedListener这两个方法,通过名字我们可以猜测这应该就是我们要找的package监听器的添加和删除方法
。那么接下来我们来看下ILauncherApps接口的实现。其实现类LauncherAppsImpl是在LauncherAppsService的内部类,代码路径是frameworks/base/services/core/java/