Launcher3 安装App加载显示过程分析

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实现类的方法会被回调,通过抽象类 LauncherAppsCompatOnAppsChangedCallbackCompat的接口进行处理

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值