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

灰色网站建设优化可信网站值得做吗

灰色网站建设优化,可信网站值得做吗,公众号开发单位,住房和城乡建设部干部学院网站布局结构 抓取布局后#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.w-s-a.com/news/375088/

相关文章:

  • 怎么获取网站数据做统计百度快照推广有效果吗
  • 淘宝领卷网站什么做制造网站开发
  • 如何做com的网站网站建设投标书模板
  • 郑州网络营销网站优化网站技术方案怎么写
  • 济南市住房和城乡建设局网站wordpress mnews主题
  • ios开发网站app网站建设企业有哪些方面
  • 网站主页 优帮云深圳代做网站后台
  • app 与网站网站建设要做什么
  • 厦门国外网站建设公司郑州核酸点推vip服务
  • 免费网线seo外链怎么做
  • 宽带技术网网站wordpress widget hook
  • 山西省住房和城乡建设厅网站报名wordpress添加标签插件
  • 网站怎么自己做外贸网站案例
  • 做网站的优势公司网站怎么做站外链接
  • 海城网站制作建设精准营销的营销方式
  • 北京短视频拍摄公司重庆网站seo推广公司
  • 广州免费推广网站建设4399网页游戏大全
  • 网站的构架与组成建站公司兴田德润
  • php网站部署步骤邯郸哪有做网站的
  • 做设计什么设计比较好的网站南充市住房和城乡建设局考试网站
  • 郑州做系统集成的公司网站龙岩
  • 厦门SEO_厦门网站建设网络营销课程视频
  • vs 2015 网站开发开网店在线咨询
  • 前端如何优化网站性能大学学校类网站设计
  • 中国铁路建设投资公司网站熊学军中国it外包公司排名前50
  • 房产网站的建设广州推广排名
  • 湟源县网站建设wordpress删除未分类
  • 营销型网站开发推广厦门百度seo公司
  • 遵义网站开发培训上海中高风险地区名单最新
  • 禹州市门户网站建设做网站可以申请个体户么