launcher3的Folder分析

主要做launcher3的Folder的一些源碼分析

1.  加載widget桌面的Folder的佈局文件default_apps.xml的堆棧分析,如下所示
    java.lang.Throwable
    at com.android.launcher3.VolteAppsProvider$DatabaseHelper.loadApps(VolteAppsProvider.java:321)
    at com.android.launcher3.VolteAppsProvider.loadDefaultAppsIfNecessary(VolteAppsProvider.java:776)
    at com.android.launcher3.LauncherModel$LoaderTask.loadAllApps(LauncherModel.java:3145)
    at com.android.launcher3.LauncherModel$LoaderTask.loadAndBindAllApps(LauncherModel.java:3011)
    at com.android.launcher3.LauncherModel$LoaderTask.run(LauncherModel.java:1861)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:135)
    at android.os.HandlerThread.run(HandlerThread.java:61)

2.  加載menu菜單中的Folder的佈局文件default_workspace_4x4.xml的堆棧,如下所示
 java.lang.Throwable
    at com.android.launcher3.DynamicGrid.<init>(DynamicGrid.java:56)
    at com.android.launcher3.LauncherAppState.createDynamicGrid(LauncherAppState.java:250)
    at com.android.launcher3.LauncherAppState.initDynamicGrid(LauncherAppState.java:229)
    at com.android.launcher3.Launcher.onCreate(Launcher.java:423)
    at android.app.Activity.performCreate(Activity.java:6012)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2295)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2413)
    at android.app.ActivityThread.access$800(ActivityThread.java:154)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1316)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:135)
    at android.app.ActivityThread.main(ActivityThread.java:5354)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:947)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:742)

3.  對Folder中的app進行排列computePreviewDrawingParams();
java.lang.Throwable
    at com.android.launcher3.FolderIcon.computePreviewDrawingParams(FolderIcon.java:498)
    at com.android.launcher3.FolderIcon.computePreviewDrawingParams(FolderIcon.java:526)
    at com.android.launcher3.FolderIcon.dispatchDraw(FolderIcon.java:627)
    at android.view.View.updateDisplayListIfDirty(View.java:14177)
    at android.view.View.getDisplayList(View.java:14204)
    at android.view.View.draw(View.java:14974)
    at android.view.ViewGroup.drawChild(ViewGroup.java:3457)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3244)
    at com.android.launcher3.ShortcutAndWidgetContainer.dispatchDraw(ShortcutAndWidgetContainer.java:93)
    at android.view.View.updateDisplayListIfDirty(View.java:14177)
    at android.view.View.getDisplayList(View.java:14204)
    at android.view.View.draw(View.java:14974)
    at android.view.ViewGroup.drawChild(ViewGroup.java:3457)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3244)
    at com.android.launcher3.CellLayout.dispatchDraw(CellLayout.java:518)
    at android.view.View.draw(View.java:15249)
    at android.view.View.updateDisplayListIfDirty(View.java:14182)
    at android.view.View.getDisplayList(View.java:14204)
    at android.view.View.draw(View.java:14974)
    at android.view.ViewGroup.drawChild(ViewGroup.java:3457)
    at com.android.launcher3.PagedView.dispatchDraw(PagedView.java:1339)
    at android.view.View.draw(View.java:15249)
    at android.view.View.updateDisplayListIfDirty(View.java:14182)
    at android.view.View.getDisplayList(View.java:14204)
    at android.view.View.draw(View.java:14974)
    at android.view.ViewGroup.drawChild(ViewGroup.java:3457)
    at com.android.launcher3.DragLayer.drawChild(DragLayer.java:949)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3244)
    at com.android.launcher3.DragLayer.dispatchDraw(DragLayer.java:915)
    at android.view.View.updateDisplayListIfDirty(View.java:14177)
    at android.view.View.getDisplayList(View.java:14204)
:   at android.view.View.draw(View.java:14974)
    at android.view.ViewGroup.drawChild(ViewGroup.java:3457)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3244)
    at android.view.View.draw(View.java:15249)
    at android.widget.FrameLayout.draw(FrameLayout.java:598)
    at android.view.View.updateDisplayListIfDirty(View.java:14182)
    at android.view.View.getDisplayList(View.java:14204)
    at android.view.View.draw(View.java:14974)
    at android.view.ViewGroup.drawChild(ViewGroup.java:3457)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3244)
    at android.view.View.updateDisplayListIfDirty(View.java:14177)
    at android.view.View.getDisplayList(View.java:14204)
    at android.view.View.draw(View.java:14974)
    at android.view.ViewGroup.drawChild(ViewGroup.java:3457)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3244)
    at android.view.View.updateDisplayListIfDirty(View.java:14177)
    at android.view.View.getDisplayList(View.java:14204)
    at android.view.View.draw(View.java:14974)
    at android.view.ViewGroup.drawChild(ViewGroup.java:3457)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3244)
    at android.view.View.draw(View.java:15249)
    at android.widget.FrameLayout.draw(FrameLayout.java:598)
    at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2674)
    at android.view.View.updateDisplayListIfDirty(View.java:14182)
    at android.view.View.getDisplayList(View.java:14204)
    at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:273)
    at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:279)
    at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:318)
    at android.view.ViewRootImpl.draw(ViewRootImpl.java:2530)
    at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2352)
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1982)
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1061)
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5895)
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
    at android.view.Choreographer.doCallbacks(Choreographer.java:580)
    at android.view

4.  menu界面對Folder中的app長按增加可卸載選項操作
 java.lang.Throwable
    at com.android.launcher3.Folder.onLongClick(Folder.java:259)
    at android.view.View.performLongClick(View.java:4827)
    at android.widget.TextView.performLongClick(TextView.java:8716)
    at com.android.launcher3.CheckLongPressHelper$CheckForLongPress.run(CheckLongPressHelper.java:30)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:135)
    at android.app.ActivityThread.main(ActivityThread.java:5354)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:947)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:742)

5.  menu界面對Folder中的app長按可移動app到widget桌面的分析請查看差分包:
    ld0030_workspace的app可以移動到homescreen


6.  menu界面的Folder文件夾是在LauncherModel.loadAllApps()中段尾的以下代碼進行綁定,在這個代碼中,請關注變量“arrayForBind”

    mHandler.post(new Runnable() {
                public void run() {
                    final long bindTime = SystemClock.uptimeMillis();
                    final Callbacks callbacks = tryGetCallbacks(oldCallbacks);
                    if (callbacks != null) {
                        //callbacks.bindAppScreens(screens);
                        callbacks.bindAllApplications(added);
                        callbacks.bindAllApplications(arrayForBind, 0);
                        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");
                    }
                }
            });
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章