zoukankan      html  css  js  c++  java
  • 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);
    
            }
  • 相关阅读:
    PHP基础学习笔记(一)
    安装wampserver之后,浏览器中输入localhost页面显示IIS7解决办法
    HTML5常识总结(一)
    AngularJs中的服务
    AngularJs中的directives(指令part1)
    Happy Number——LeetCode
    Binary Tree Zigzag Level Order Traversal——LeetCode
    Construct Binary Tree from Preorder and Inorder Traversal——LeetCode
    Construct Binary Tree from Inorder and Postorder Traversal——LeetCode
    Convert Sorted Array to Binary Search Tree——LeetCode
  • 原文地址:https://www.cnblogs.com/canphp/p/2790783.html
Copyright © 2011-2022 走看看