主要做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");
}
}
});