public void onPackagesUnsuspended(String[] packageNames, UserHandle user) {
mCallback.onPackagesUnsuspended(packageNames, user);
}
@Override
public void onShortcutsChanged(@NonNull String packageName,
@NonNull List shortcuts,
@NonNull UserHandle user) {
List shortcutInfoCompats = new ArrayList<>(shortcuts.size());
for (ShortcutInfo shortcutInfo : shortcuts) {
shortcutInfoCompats.add(new ShortcutInfoCompat(shortcutInfo));
}
mCallback.onShortcutsChanged(packageName, shortcutInfoCompats, user);
}
}
- LauncherApps 是SDk开放给Launcher使用的接口,通过实现LauncherApps.CallBack接口,当应用发生改变时WrappedCallback实现类的方法会被回调,通过抽象类 LauncherAppsCompat 中OnAppsChangedCallbackCompat的接口进行处理
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 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).onStop();
if (mNotificationBadgingObserver != null) {
mNotificationBadgingObserver.unregister();
}
}
- LauncherModel onPackageAdded 中调用的 enqueueModelUpdateTask 实现
public void enqueueModelUpdateTask(ModelUpdateTask task) {
task.init(mApp, this, sBgDataModel, mBgAllAppsList, mUiExecutor);
runOnWorkerThread(task);
}
/** Runs the specified runnable immediately if called from the worker thread, otherwise it is
- posted on the worker thread handler. */
private static void runOnWorkerThread(Runnable r) {
if (sWorkerThread.getThreadId() == Process.myTid()) {
r.run();
} else {
// If we are not on the worker thread, then post to the worker handler
sWorker.post®;
}
}
- 上面主要实现是 ModelUpdateTask 在工作线程进行任务处理
/**
- A runnable which changes/updates the data model of the launcher based on certain events.
*/
public interface ModelUpdateTask extends Runnable {
/**
- Called