public abstract class LauncherAppsCompat {
public interface OnAppsChangedCallbackCompat {
void onPackageRemoved(String packageName, UserHandle user);
void onPackageAdded(String packageName, UserHandle user);
void onPackageChanged(String packageName, UserHandle user);
void onPackagesAvailable(String[] packageNames, UserHandle user, boolean replacing);
void onPackagesUnavailable(String[] packageNames, UserHandle user, boolean replacing);
void onPackagesSuspended(String[] packageNames, UserHandle user);
void onPackagesUnsuspended(String[] packageNames, UserHandle user);
void onShortcutsChanged(String packageName, List<ShortcutInfoCompat> shortcuts,
UserHandle user);
.....
private static LauncherAppsCompat sInstance;
private static final Object sInstanceLock = new Object();
public static LauncherAppsCompat getInstance(Context context) {
synchronized (sInstanceLock) {
if (sInstance == null) {
if (Utilities.ATLEAST_OREO) {
sInstance = new LauncherAppsCompatVO(context.getApplicationContext());
} else {
sInstance = new LauncherAppsCompatVL(context.getApplicationContext());
}
}
return sInstance;
}
}
//注册监听
public abstract void addOnAppsChangedCallback(OnAppsChangedCallbackCompat listener);
public abstract void removeOnAppsChangedCallback(OnAppsChangedCallbackCompat listener);
}
接着看Launcher 的OnAppsChangedCallbackCompat接口的内部实现
/**
* Maintains in-memory state of the Launcher. It is expected that there should be only one
* LauncherModel object held in a static. Also provide APIs for updating the database state
* for the Launcher.
*维护启动器的内存状态。预期应该只在静态中保存一个LauncherModel对象。还提供用于更新启动器数据库状态的API。
*/
public class LauncherModel extends BroadcastReceiver
implements LauncherAppsCompat.OnAppsChangedCallbackCompat {
@Override
public void onPackageChanged(String packageName, UserHandle user) {
int op = PackageUpdatedTask.OP_UPDATE;
enqueueModelUpdateTask(new PackageUpdatedTask(op, user, packageName));
}
@Override
public void onPackageRemoved(String packageName, UserHandle user) {
onPackagesRemoved(user, packageName);
}
public void onPackagesRemoved(UserHandle user, String... packages) {
int op = PackageUpdatedTask.OP_REMOVE;
enqueueModelUpdateTask(new PackageUpdatedTask(op, user, packages));
}
@Override
public void onPackageAdded(String packageName, UserHandle user) {
int op = PackageUpdatedTask.OP_ADD;
enqueueModelUpdateTask(new PackageUpdatedTask(op, user, packageName));
}
LauncherAppState 构造函数中进行注册监听
public class LauncherAppState {
private LauncherAppState(Context context) {
if (getLocalProvider(context) == null) {
throw new RuntimeException(
"Initializing LauncherAppState in the absence of LauncherProvider");
}
Log.v(Launcher.TAG, "LauncherAppState initiated");
Preconditions.assertUIThread();
mContext = context;
mInvariantDeviceProfile = new InvariantDeviceProfile(mContext);
mIconCache = new IconCache(mContext, mInvariantDeviceProfile);
mWidgetCache = new WidgetPreviewLoader(mContext, mIconCache);
mModel = new LauncherModel(this, mIconCache, AppFilter.newInstance(mContext));
//初始化接口
LauncherAppsCompat.getInstance(mContext).addOnAppsChangedCallback(mModel);
/**
* Call from Application.onTerminate(), which is not guaranteed to ever be called.
*/
public void onTerminate() {
mContext.unregisterReceiver(mModel);
final LauncherAppsCompat launcherApps = LauncherAppsCompat.getInstance(mContext);
launcherApps.removeOnAppsChangedCallback(mModel);
PackageInstallerCompat.getInstance(mContext).
该分析记录Launcher3 上新安装App后应用的加载显示到桌面的过程,Android API 28Android系统源码查看地址当应用安装完成后,Launcer中LauncherAppsCompatVL会向PackageManagerService系统注册回调接口public class LauncherAppsCompatVL extends LauncherAppsCompat { protected final LauncherApps mLauncherApps;