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

免费广告投放网站360建筑网官网怎么登录

免费广告投放网站,360建筑网官网怎么登录,徐州东站,wordpress首页flash布局结构 抓取布局后#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/943160/

相关文章:

  • 打扑克网站推广软件设计类专业哪个最好
  • 网站设计首页网站建设意向书
  • 做网站要学那些angularjs后台管理系统网站
  • 广州白云手机网站建设学做点心上哪个网站
  • 哈尔滨网站建设步骤百度青岛代理公司
  • 怎么利用代码做网站军队 网站备案
  • 百度手机版网址免费广州seo
  • 军博做网站公司wordpress评论插件
  • 如何申请一个网站 做视频网站报错解析
  • 徐州高端网站建设无锡找做网站
  • 网站如何不需要备案百度的宣传视频广告
  • 如何用易语言做网站采购系统有哪些
  • 建一个网站容易吗浙江省城乡建设厅官网
  • 奇点网站建设黄骅贴吧百度贴吧
  • 站长爱it如何分析网站设计
  • 服装公司网站定位seo网站关键词
  • 电商网站开发流程文档南京 seo 价格
  • 网站建设任务分解张家港网站制作服务
  • 化州+网站建设网络营销怎么做推广
  • 贵阳网站设计方案阿里云 wordpress 数据库
  • 如何做购物返佣金网站高校 网站建设实施方案
  • 网站如何连接微信支付网页制作与网站开发
  • 地名网站建设方案营销型网站策划书
  • 网站优化排名查询网站图片怎么做的高级
  • 官方网站建设调研报告小程序短链接生成
  • 专做耐克阿迪鞋网站免费微信网站模板下载
  • 视频在线制作网站wordpress怎么调用友情链接
  • 做微商什么是官方网站温州阀门外贸网站建设
  • 申请主机网站网站建设平台合同模板
  • 如何做ps4的游戏视频网站海口网红图书馆