我是靠谱客的博主 要减肥翅膀,最近开发中收集的这篇文章主要介绍【源码剖析】Launcher 8.0 源码 (21) --- Launcher 启动流程 第六步之loadAllApps第1小步从系统读取数据,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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小步从系统读取数据所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(67)

评论列表共有 0 条评论

立即
投稿
返回
顶部