概述
Launcher8.0启动流程的第六步在workspace图标显示完成就开始准备allapp的显示。因为allapp需要点击或滑动allappButton才能打开,所以显示在workspace之后。Loadallapp是从系统获取所有的应用,然后将其显示到allapp里面。
private void loadAllApps() {
//仍然回调Launcher的方法,所以先获取Launcher的对象。
final Callbacks oldCallbacks = mCallbacks.get();
final List<UserHandle> profiles = mUserManager.getUserProfiles();
//从系统获取activity列表,getActivityList最终使用的是系统方法
ServiceManager.getService(Context.LAUNCHER_APPS_SERVICE)
.getLauncherActivities(mContext.getPackageName(),
packageName, user), user),在getActivityList传入的两个参数是packagename和user,用于筛选手机中的应用,这里packagename为空,传入当前的user则最终获取整个手机在当前user下所支持的全部应用。
而后将获取的应用存放到集合mBgAllAppsList中。
mBgAllAppsList.clear();
for (UserHandle user : profiles) {
final List<LauncherActivityInfo> apps = mLauncherApps.getActivityList(null, user);
boolean quietMode = mUserManager.isQuietModeEnabled(user);
for (int i = 0; i < apps.size(); i++) {
LauncherActivityInfo app = apps.get(i);
mBgAllAppsList.add(new AppInfo(app, user, quietMode), app);
}
final ManagedProfileHeuristic heuristic = ManagedProfileHeuristic.get(mContext, user);
if (heuristic != null) {
scheduleManagedHeuristicRunnable(heuristic, user, apps);
}
}
final ArrayList<AppInfo> added = mBgAllAppsList.added;
mBgAllAppsList.added = new ArrayList<AppInfo>();
//将所有应用放到集合中就完成了loadapp是,接下来回调Launcher的bindAllApplications,完成绑定。因为app位置的连续排列,而且只有应用,没有Folder和widget所以代码量比
workspace少。
mHandler.post(new Runnable() {
public void run() {
final long bindTime = SystemClock.uptimeMillis();
final Callbacks callbacks = tryGetCallbacks(oldCallbacks);
if (callbacks != null) {
callbacks.bindAllApplications(added);
if (DEBUG_LOADERS) {
Log.d(TAG, "bound " + added.size() + " apps in "
+ (SystemClock.uptimeMillis() - bindTime) + "ms");
}
} else {
Log.i(TAG, "not binding apps: no Launcher activity");
}
}
});
}
//bindAllApplications就是调用 mAppsView.setApps(apps) mAppsView.setApps(apps) 又调用 mApps.setApps(apps)然后调用addApps(apps)再深入调用onAppsUpdated()。以上方法一次调用最终到onAppsUpdated()方法。
private void onAppsUpdated() {
//这个方法在AlphabeticalAppsList类中,mApps是List<AppInfo> 集合,首先将所有的应用放入该集合中,然后使用mAppNameComparator来排列。
mApps.clear();
mApps.addAll(mComponentToAppMap.values());
Collections.sort(mApps, mAppNameComparator);
排列方法是按字母排列,原生的allapp里面的应用就是按字母排序,排序代码如下:
public int compare(AppInfo a, AppInfo b) {
// Order by the title in the current locale
int result = mLabelComparator.compare(a.title.toString(), b.title.toString());
if (result != 0) {
return result;
}
// If labels are same, compare component names
result = a.componentName.compareTo(b.componentName);
if (result != 0) {
return result;
}
if (mMyUser.equals(a.user)) {
return -1;
} else {
Long aUserSerial = mUserManager.getSerialNumberForUser(a.user);
Long bUserSerial = mUserManager.getSerialNumberForUser(b.user);
return aUserSerial.compareTo(bUserSerial);
}
}
到此,allapp就load完成,allapp和workspace相比要简单很多,主要简单在allapp不需要数据库,而排列方式也是不可选择。此外,allapp里面一定是所有的应用。而workspace只会放部分的应用,所以workspace远比allapp复杂。
最后
以上就是要减肥翅膀为你收集整理的【源码剖析】Launcher 8.0 源码 (21) --- Launcher 启动流程 第六步之loadAllApps第1小步从系统读取数据的全部内容,希望文章能够帮你解决【源码剖析】Launcher 8.0 源码 (21) --- Launcher 启动流程 第六步之loadAllApps第1小步从系统读取数据所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复