当前位置: 首页 > news >正文

wdcp 网站备份自发购卡网站在吗做

wdcp 网站备份,自发购卡网站在吗做,网站开发语言入门,网站开发+百度编辑器布局结构 抓取布局后#xff0c;可以看到每个图标是一个DoubleShadowBubbleTextView#xff0c;父布局是CellLayout、workspace。 我们可以在CellLayout添加子view打印出调用堆栈信息#xff0c;可以整体上看页面加载显示流程。 主要类 Launcher.java#xff1a;主界面可以看到每个图标是一个DoubleShadowBubbleTextView父布局是CellLayout、workspace。 我们可以在CellLayout添加子view打印出调用堆栈信息可以整体上看页面加载显示流程。 主要类 Launcher.java主界面即MainActivitylauncher.xml主界面布局文件LauncherModel.java管理Launcher状态包括加载任务、状态回调等LoaderTask.java加载任务是一个RunnableLoaderResults.java加载结果BgDataModel#Callbacks数据回调接口Launcher实现该接口加载任务通过该接口回调给LauncherLauncherProvider桌面数据提供者采用db保存桌面图标数据包括排列位置、类型等LauncherSettings封装访问LauncherProvider时的uri、column等一些常量通过ContentResolver来访问LauncherProvider不直接操作dbLoaderCursor封装cursor操作 流程图 创建Activity 主界面创建的时候常规的setContentView和findView创建LauncherModel并开始加载数据 // Launcher.java protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 1.创建LauncherAppState和LauncherModelLauncherAppState app LauncherAppState.getInstance(this);mModel app.getModel();// 2.infalte布局文件找到viewsetupViews();// 3. 设置loader监听开始加载数据加载完成后回调给主界面if (!mModel.addCallbacksAndLoad(this)) {if (!internalStateHandled) {// If we are not binding synchronously, pause drawing until initial bind complete,// so that the system could continue to show the device loading promptmOnInitialBindListener Boolean.FALSE::booleanValue;}}// 4. 设置view给ActivitysetContentView(getRootView());加载数据 创建加载任务 mModel.addCallbacksAndLoad将Launcher设置给LauncherModel然后创建了加载任务 // LauncherModel.java /*** Adds a callbacks to receive model updates* return true if workspace load was performed synchronously*/ public boolean addCallbacksAndLoad(NonNull final Callbacks callbacks) {synchronized (mLock) {addCallbacks(callbacks);return startLoader(new Callbacks[] { callbacks });} }private boolean startLoader(NonNull final Callbacks[] newCallbacks) {synchronized (mLock) {// 1.取消旧的加载任务boolean wasRunning stopLoader(); // 之前没有loader任务wasRunning为falseboolean bindDirectly mModelLoaded !mIsLoaderTaskRunning;// 之前没有加载过bindDirectly为falseboolean bindAllCallbacks wasRunning || !bindDirectly || newCallbacks.length 0; // bindAllCallbacks为true, 上一步已经addCallbacks了,所以callbacksList里面包含从Launcher.java传进来的callbacksfinal Callbacks[] callbacksList bindAllCallbacks ? getCallbacks() : newCallbacks;if (callbacksList.length 0) {// 2.清空PendingBindfor (Callbacks cb : callbacksList) {MAIN_EXECUTOR.execute(cb::clearPendingBinds);}// 3.创建LoaderResults和LoaderTask开始加载数据LoaderResults loaderResults new LoaderResults(mApp, mBgDataModel, mBgAllAppsList, callbacksList);if (bindDirectly) {loaderResults.bindWorkspace(bindAllCallbacks);loaderResults.bindAllApps();loaderResults.bindDeepShortcuts();loaderResults.bindWidgets();return true;} else {stopLoader();mLoaderTask new LoaderTask(mApp, mBgAllAppsList, mBgDataModel, mModelDelegate, loaderResults);MODEL_EXECUTOR.post(mLoaderTask);}}} }整体加载步骤 LoaderTask#run中根据类型加载步骤分为了5步图标的加载主要看第一步 // LoaderTask.java public void run() {try (LauncherModel.LoaderTransaction transaction mApp.getModel().beginLoader(this)) {// first stepListShortcutInfo allShortcuts new ArrayList();loadWorkspace(allShortcuts, memoryLogger);// Sanitize data re-syncs widgets/shortcuts based on the workspace loaded from db.// sanitizeData should not be invoked if the workspace is loaded from a db different// from the main db as defined in the invariant device profile.// (e.g. both grid preview and minimal device mode uses a different db)if (mApp.getInvariantDeviceProfile().dbFile.equals(mDbName)) {sanitizeData();}mResults.bindWorkspace(true /* incrementBindId */);mModelDelegate.workspaceLoadComplete();// Notify the installer packages of packages with active installs on the first screen.sendFirstScreenActiveInstallsBroadcast();// Take a breakwaitForIdle();// second stepListLauncherActivityInfo allActivityList;allActivityList loadAllApps();mResults.bindAllApps();IconCacheUpdateHandler updateHandler mIconCache.getUpdateHandler();setIgnorePackages(updateHandler);updateHandler.updateIcons(allActivityList,LauncherActivityCachingLogic.newInstance(mApp.getContext()),mApp.getModel()::onPackageIconsUpdated);updateHandler.updateIcons(allShortcuts, new ShortcutCachingLogic(),mApp.getModel()::onPackageIconsUpdated);waitForIdle();// third stepListShortcutInfo allDeepShortcuts loadDeepShortcuts();mResults.bindDeepShortcuts();updateHandler.updateIcons(allDeepShortcuts,new ShortcutCachingLogic(), (pkgs, user) - { });waitForIdle();// fourth stepListComponentWithLabelAndIcon allWidgetsList mBgDataModel.widgetsModel.update(mApp, null);mResults.bindWidgets();updateHandler.updateIcons(allWidgetsList,new ComponentWithIconCachingLogic(mApp.getContext(), true),mApp.getModel()::onWidgetLabelsUpdated);// fifth steploadFolderNames();updateHandler.finish();mModelDelegate.modelLoadComplete();transaction.commit();} catch (CancellationException e) {...} }图标解析 loadWorkspace()代码比较多主要作用是通过ContentResolver查询LauncherProvider中保存的桌面图标信息然后遍历cursor来解析数据。 在分析代码的时候抓到数据流向可以结合真实的db数据进行分析其中一些判断容错处理可以跳过 主要流程如下 加载默认的数据Provider会有判断只有第一次才会加载通过ContentResolver查询所有数据遍历cursor根据不同图标类型进行解析如ITEM_TYPE_APPLICATION代表普通的图标ITEM_TYPE_FOLDER代表文件夹对数据进行一些校验校验通过后将数据添加到mBgDataModel 数据流向 Db(LauncherProvider) -- Cursor(LoaderCursor) -- List(BgDataModel) protected void loadWorkspace(ListShortcutInfo allDeepShortcuts,Uri contentUri,String selection,Nullable LoaderMemoryLogger logger) {final Context context mApp.getContext();final ContentResolver contentResolver context.getContentResolver();// 1. 加载默认的数据Provider会有判断只有第一次才会加载LauncherSettings.Settings.call(contentResolver,LauncherSettings.Settings.METHOD_LOAD_DEFAULT_FAVORITES);synchronized (mBgDataModel) {mBgDataModel.clear();mPendingPackages.clear();// 2. 查询所有数据final LoaderCursor c new LoaderCursor(contentResolver.query(contentUri, null, selection, null, null), contentUri,mApp, mUserManagerState);final Bundle extras c.getExtras();mDbName extras null? null : extras.getString(LauncherSettings.Settings.EXTRA_DB_NAME);try {// 2.1 遍历cursorfinal int appWidgetIdIndex c.getColumnIndexOrThrow(LauncherSettings.Favorites.APPWIDGET_ID);final int appWidgetProviderIndex c.getColumnIndexOrThrow(LauncherSettings.Favorites.APPWIDGET_PROVIDER);final int spanXIndex c.getColumnIndexOrThrow(LauncherSettings.Favorites.SPANX);final int spanYIndex c.getColumnIndexOrThrow(LauncherSettings.Favorites.SPANY);final int rankIndex c.getColumnIndexOrThrow(LauncherSettings.Favorites.RANK);final int optionsIndex c.getColumnIndexOrThrow(LauncherSettings.Favorites.OPTIONS);final int sourceContainerIndex c.getColumnIndexOrThrow(LauncherSettings.Favorites.APPWIDGET_SOURCE);WorkspaceItemInfo info;LauncherAppWidgetInfo appWidgetInfo;LauncherAppWidgetProviderInfo widgetProviderInfo;Intent intent;String targetPkg;ListIconRequestInfoWorkspaceItemInfo iconRequestInfos new ArrayList();while (!mStopped c.moveToNext()) {try {// 2.2 根据不同图标类型进行解析ITEM_TYPE_APPLICATION代表普通的图标ITEM_TYPE_FOLDER代表文件夹switch (c.itemType) {case LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT:case LauncherSettings.Favorites.ITEM_TYPE_APPLICATION:case LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT:intent c.parseIntent();// 2.3 解析数据进行一些校验判断if (info ! null) {if (info.itemType! LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT) {// Skip deep shortcuts; their title and icons have already been// loaded above.iconRequestInfos.add(c.createIconRequestInfo(info, useLowResIcon));}c.applyCommonProperties(info);info.intent intent;info.rank c.getInt(rankIndex);info.spanX 1;info.spanY 1;info.runtimeStatusFlags | disabledState;if (isSafeMode !isSystemApp(context, intent)) {info.runtimeStatusFlags | FLAG_DISABLED_SAFEMODE;}LauncherActivityInfo activityInfo c.getLauncherActivityInfo();if (activityInfo ! null) {info.setProgressLevel(PackageManagerHelper.getLoadingProgress(activityInfo),PackageInstallInfo.STATUS_INSTALLED_DOWNLOADING);}if (c.restoreFlag ! 0 !TextUtils.isEmpty(targetPkg)) {tempPackageKey.update(targetPkg, c.user);SessionInfo si installingPkgs.get(tempPackageKey);if (si null) {info.runtimeStatusFlags ~ItemInfoWithIcon.FLAG_INSTALL_SESSION_ACTIVE;} else if (activityInfo null) {int installProgress (int) (si.getProgress() * 100);info.setProgressLevel(installProgress,PackageInstallInfo.STATUS_INSTALLING);}}// 3.将数据添加到mBgDataModelc.checkAndAddItem(info, mBgDataModel, logger);} else {throw new RuntimeException(Unexpected null WorkspaceItemInfo);}break;case LauncherSettings.Favorites.ITEM_TYPE_FOLDER:FolderInfo folderInfo mBgDataModel.findOrMakeFolder(c.id);c.applyCommonProperties(folderInfo);// Do not trim the folder label, as is was set by the user.folderInfo.title c.getString(c.titleIndex);folderInfo.spanX 1;folderInfo.spanY 1;folderInfo.options c.getInt(optionsIndex);// no special handling required for restored foldersc.markRestored();c.checkAndAddItem(folderInfo, mBgDataModel, logger);break;}} catch (Exception e) {Log.e(TAG, Desktop items loading interrupted, e);}}} finally {IOUtils.closeSilently(c);}// Load delegate itemsmModelDelegate.loadItems(mUserManagerState, shortcutKeyToPinnedShortcuts);// Load string cachemModelDelegate.loadStringCache(mBgDataModel.stringCache);// Remove dead itemsmItemsDeleted c.commitDeleted();// Sort the folder items, update ranks, and make sure all preview items are high res.FolderGridOrganizer verifier new FolderGridOrganizer(mApp.getInvariantDeviceProfile());for (FolderInfo folder : mBgDataModel.folders) {Collections.sort(folder.contents, Folder.ITEM_POS_COMPARATOR);verifier.setFolderInfo(folder);int size folder.contents.size();// Update ranks here to ensure there are no gaps caused by removed folder items.// Ranks are the source of truth for folder items, so cellX and cellY can be ignored// for now. Database will be updated once user manually modifies folder.for (int rank 0; rank size; rank) {WorkspaceItemInfo info folder.contents.get(rank);info.rank rank;if (info.usingLowResIcon() info.itemType LauncherSettings.Favorites.ITEM_TYPE_APPLICATION verifier.isItemInPreview(info.rank)) {mIconCache.getTitleAndIcon(info, false);}}}c.commitRestoredItems();} }可以结合db数据进行分析 container: 表示显示的布局像普通、文件夹、dock栏等screen: 表示现在第几屏itemType表示类型像应用图标、文件夹、快捷方式等 图标显示 到这里我们已经获取到桌面数据了下面就是要设置到view显示出来。在上面LoaderTask#run()中loadWorkspace()获取到了数据而ui显示的触发在mResults.bindWorkspace(true) bindWorkspace()先是将数据复制一份然后遍历callback进行bind。上一步mBgDataModel保存了数据库中数据mBgDataModel是LauncherModel的一个成员变量在activity#onCreate时创建的而activity就是Callbacks所以到这里都关联了起来。 Launcher (Callbacks)— LoaderTask — LoaderResults -- BgDataModel -- Callbacks // LoaderResults.java /*** Binds all loaded data to actual views on the main thread.*/ public void bindWorkspace(boolean incrementBindId) {// Save a copy of all the bg-thread collectionsArrayListItemInfo workspaceItems new ArrayList();ArrayListLauncherAppWidgetInfo appWidgets new ArrayList();final IntArray orderedScreenIds new IntArray();ArrayListFixedContainerItems extraItems new ArrayList();synchronized (mBgDataModel) {workspaceItems.addAll(mBgDataModel.workspaceItems);appWidgets.addAll(mBgDataModel.appWidgets);orderedScreenIds.addAll(mBgDataModel.collectWorkspaceScreens());mBgDataModel.extraItems.forEach(extraItems::add);if (incrementBindId) {mBgDataModel.lastBindId;}mMyBindingId mBgDataModel.lastBindId;}for (Callbacks cb : mCallbacksList) {new WorkspaceBinder(cb, mUiExecutor, mApp, mBgDataModel, mMyBindingId,workspaceItems, appWidgets, extraItems, orderedScreenIds).bind();} }WorkspaceBinder中bind方法会执行callback回调回调到activity后创建BubbleTextView添加到CellLayout。
http://www.dnsts.com.cn/news/29169.html

相关文章:

  • wordpress 文章 来源seo还能赚钱吗
  • 网站开发与运维收费明细网络推广沈阳
  • 网站建设培训中心网站开发的流程是怎样的
  • 本地唐山网站建设广州网站建设信科公司
  • 有哪些网站可以做家教百度联盟注册
  • 怎样做淘宝的导购网站如何制作简单的网站
  • 枫叶的网站建设博客求网页设计与网站建设
  • 做户外的网站丁香花在线视频观看免费
  • 做背景网站网站代码图片
  • 网站搭建徐州百度网络大连权威发布网站
  • 网站的ftp管理权限是什么意思厦门景观绿环建设行业协会网站
  • 竞价网站做招商加盟可以不备案吗h5网站建设的具体内容
  • 网站制作费网站空间站
  • 廊坊网站制作网页wordpress 仪表板主题
  • 南京网站优化推广东莞网站建设选择菲凡网络
  • weex做网站外贸网店
  • 哪个网站可以做创意短视频网站网站制作九江
  • 织梦网站入侵网站屏蔽省份
  • 沈阳大熊网站建设制作番禺论坛网站建设
  • 南通做网站的公司简述网络营销的特点
  • 建筑公司网站md0095设计风格移动端网站怎么做外链
  • 简单的企业网站php开发外贸客户的免费平台
  • 网易云音乐网站开发介绍浙江住房和城乡建设厅网站
  • 晋江企业网站制作视觉上体验的网站
  • 做擦边球视频网站wordpress 小云app
  • 网站后台模版创建一个网址需要多少钱
  • 网站开发的人怎么样家具品牌网站
  • 帮做试卷的网站汽车行业市场分析那个网站做的好
  • 国外设计学院网站怎么建立一个网站存照片视频的链接
  • 网站制作公司下小程序制作需求文档