• android luancher 应用信息的传递


    1.简要说明,其他部分列掉:

    2.进入AllAppsList,属性data是所有应用的一个数组集合。

    3.进入LauncherModel,进入onlyBindAllApps方法查看到:

      final Callbacks oldCallbacks = mCallbacks.get();
                if (oldCallbacks == null) {
                    // This launcher has exited and nobody bothered to tell us.  Just bail.
                    Log.w(TAG, "LoaderTask running with no launcher (onlyBindAllApps)");
                    return;
                }
    
                // shallow copy
                final ArrayList<ApplicationInfo> list
                        = (ArrayList<ApplicationInfo>)mAllAppsList.data.clone();
                mHandler.post(new Runnable() {
                    public void run() {
                        final long t = SystemClock.uptimeMillis();
                        final Callbacks callbacks = tryGetCallbacks(oldCallbacks);
                        if (callbacks != null) {
                            callbacks.bindAllApplications(list);
                        }
                        if (DEBUG_LOADERS) {
                            Log.d(TAG, "bound all " + list.size() + " apps from cache in "
                                    + (SystemClock.uptimeMillis()-t) + "ms");
                        }
                    }
                });

    4.定义了一个回调,然后通过回调函数callbacks.bindAllApplications(list);

    5.查找回调函数bindAllApplications,进入Launcher,找到bindAllApplications函数。

        public void bindAllApplications(final ArrayList<ApplicationInfo> apps) {
            // Remove the progress bar entirely; we could also make it GONE
            // but better to remove it since we know it's not going to be used
            View progressBar = mAppsCustomizeTabHost.
                findViewById(R.id.apps_customize_progress_bar);
            if (progressBar != null) {
                ((ViewGroup)progressBar.getParent()).removeView(progressBar);
            }
            // We just post the call to setApps so the user sees the progress bar
            // disappear-- otherwise, it just looks like the progress bar froze
            // which doesn't look great
            mAppsCustomizeTabHost.post(new Runnable() {
                public void run() {
                    if (mAppsCustomizeContent != null) {
                        mAppsCustomizeContent.setApps(apps);
                    }
                }
            });
        }

    6.看到这句代码mAppsCustomizeContent.setApps(apps),找到setapps方法。

     public void setApps(ArrayList<ApplicationInfo> list) {
            mApps = list;
            Collections.sort(mApps, LauncherModel.APP_NAME_COMPARATOR);
            updatePageCounts();
    
            // The next layout pass will trigger data-ready if both widgets and apps are set, so 
            // request a layout to do this test and invalidate the page data when ready.
            if (testDataReady()) requestLayout();
        }

    7.返回Launchermodel找到比较器.(根据标题进行排序)

     private static final Collator sCollator = Collator.getInstance();
        public static final Comparator<ApplicationInfo> APP_NAME_COMPARATOR
                = new Comparator<ApplicationInfo>() {
            public final int compare(ApplicationInfo a, ApplicationInfo b) {
                int result = sCollator.compare(a.title.toString(), b.title.toString());
                if (result == 0) {
                    result = a.componentName.compareTo(b.componentName);
                }
                return result;
            }
        };

    8.获取总数

    private void updatePageCounts() {
            mNumWidgetPages = (int) Math.ceil(mWidgets.size() /
                    (float) (mWidgetCountX * mWidgetCountY));
            mNumAppsPages = (int) Math.ceil((float) mApps.size() / (mCellCountX * mCellCountY));
        }

    9.一部通知显示当前页的项:

     public void syncAppsPageItems(int page, boolean immediate) {
            // ensure that we have the right number of items on the pages
            int numCells = mCellCountX * mCellCountY;
            int startIndex = page * numCells;
            int endIndex = Math.min(startIndex + numCells, mApps.size());
            PagedViewCellLayout layout = (PagedViewCellLayout) getPageAt(page);
    
            layout.removeAllViewsOnPage();
            ArrayList<Object> items = new ArrayList<Object>();
            ArrayList<Bitmap> images = new ArrayList<Bitmap>();
            for (int i = startIndex; i < endIndex; ++i) {
                ApplicationInfo info = mApps.get(i);
                PagedViewIcon icon = (PagedViewIcon) mLayoutInflater.inflate(
                        R.layout.apps_customize_application, layout, false);
                icon.applyFromApplicationInfo(info, true, mHolographicOutlineHelper);
                icon.setOnClickListener(this);
                icon.setOnLongClickListener(this);
                icon.setOnTouchListener(this);
    
                int index = i - startIndex;
                int x = index % mCellCountX;
                int y = index / mCellCountX;
    
                layout.addViewToCellLayout(icon, -1, i, new PagedViewCellLayout.LayoutParams(x,y, 1,1));
    
                items.add(info);
                images.add(info.iconBitmap);
    
            }
  • 相关阅读:
    Java 9 揭秘(14. HTTP/2 Client API)
    Java 9 揭秘(13. Collection API 更新)
    Java 9 揭秘(12. Process API 更新)
    JAVA数组与List相互转换
    linux下开启oracle服务和开启监听
    Centos7安装Redis
    Hibernate乐观锁无法Catch到org.hibernate.StaleObjectStateException
    Eclipse远程调试Tomcat
    Centos7 使用Docker搭建Oracle测试环境
    Maven安装Oracle驱动包到本地仓库
  • 原文地址:https://www.cnblogs.com/canphp/p/2790783.html
Copyright © 2020-2023  润新知