美文网首页
Launcher3 快捷图标点击事件绑定-API28

Launcher3 快捷图标点击事件绑定-API28

作者: ArcherZang | 来源:发表于2020-03-15 15:09 被阅读0次
launcher绑定view事件
  1. Launcher.onCreate()->
    • (1) LauncherAppState app = LauncherAppState.getInstance(this);
      获取getInstance单例,构造LauncherModel传入IconCache和IntentFilter filter放入 mBgAllAppsList并将LauncherAppState给mAPP;
    • (2) mModel = app.setLauncher(this);
      为launcher设置监听,
      LauncherAppState调用内部LauncherModel类型的mMode的initialize()方法将launcher作为callback加入mModel的WeakReference mCallbacks中
      并且返回mModel;
    • int currentScreen = PagedView.INVALID_RESTORE_PAGE;
      值是-1001
    • (3) mModel.startLoader(currentScreen);
  2. LauncherModel.startLoader(int synchronousBindPage)返回值boolean->
    • (1) LoaderResults loaderResults = new LoaderResults(mApp, sBgDataModel,mBgAllAppsList, synchronousBindPage, mCallbacks);
    • 所需变量sBgDataModel类加载的时候初始化,synchronousBindPage是方法调用传入;
      在LancherAppState的构造方法中调用LauncherModel构造方法传入mApp(LauncherAppState)和mBgAllAppsList,
      LancherAppState调用LauncherModel的initialize传入mCallbacks;
    • (2)startLoaderForResults(loaderResults);
    • 因为mModelLoaded默认是false所以调用;
  3. LoaderResults.startLoaderForResults(LoaderResults results)->
    清空mLoaderTask并停止旧的,mLoaderTask = new LoaderTask(mApp, mBgAllAppsList, sBgDataModel, results);然后执行它
  4. new LoaderTask()->
    将mApp、mBgAllAppsList、mBgDataModel、mResults = results;
    并获取以下实例
    mLauncherApps = LauncherAppsCompat.getInstance(mApp.getContext());
    mUserManager = UserManagerCompat.getInstance(mApp.getContext());
    mShortcutManager = DeepShortcutManager.getInstance(mApp.getContext());
    mPackageInstaller = PackageInstallerCompat.getInstance(mApp.getContext());
    mAppWidgetManager = AppWidgetManagerCompat.getInstance(mApp.getContext());
    mIconCache = mApp.getIconCache();
    //来自LauncherAppState,提供icon获取主要来自 IconProvider IconDB mPackageManager
    //mPackageManager是获取应用resources对应id图片
    //为DB获取提供本地缓存
  5. LoaderTask.run()->
    因为mStopped默认false所以开始下面的流程
    • (1) 创建自动关闭流LauncherModel.LoaderTransaction,
      并将自己传入,用于判断是否操作当前对象;
    • (2) 调用loadWorkspace()
      主要看synchronized (mBgDataModel){}大括号内代码
      mBgDataModel.clear()
      清除mBgDataModel内部所以缓存
      mPackageInstaller.updateAndGetActiveSessionCache()
      获取已安装信息
      mFirstScreenBroadcast = new FirstScreenBroadcast(installingPkgs);
      新建第一个屏幕的广播
      mBgDataModel.workspaceScreens.addAll(LauncherModel.loadWorkspaceScreensDb(context))
      工作屏幕id
      final LoaderCursor c = new LoaderCursor(contentResolver.query(
      LauncherSettings.Favorites.CONTENT_URI, null, null, null, null), mApp);
      获取桌面快捷图标信息,
      然后循环游标获取,标记当前删除或者更新对应内容,
      然后把属性封装各种类型的info装入mBgDataModel,当前元素最多是一种info:
      ShortcutInfo, SessionInfo(会被转成ShortcutInfo) FolderInfo, LauncherAppWidgetInfo
    • (3) mResults.bindWorkspace()
      mBgDataModel的ItemInfo、LauncherAppWidgetInfo、屏幕Id放到本地各自的list当中
      按照当前屏幕把itemInfo和LauncherAppWidgetInfo各自分成current和other两个list
      然后筛选当前屏幕的itemInfo和LauncherAppWidgetInfo
      排序当前iteminfo和otheriteminfo
      在MainThreadExecutor中执行调用callbacks.startBinding()的Runnable,做清空和刷新操作
      在MainThreadExecutor中执行调用callbacks.bindScreens(orderedScreenIds)的Runnable,绑定屏幕id到Workspace
      然后绑定快捷图标和部件到当前页bindWorkspaceItems(currentWorkspaceItems, currentAppWidgets, mainExecutor)
      /packages/apps/Launcher3/src/com/android/launcher3/Launcher.java
      获取final Executor deferredExecutor =
      validFirstPage ? new ViewOnDrawExecutor() : mainExecutor;
      在MainThreadExecutor中执行调用
      callbacks.finishFirstPageBind(validFirstPage ? (ViewOnDrawExecutor) deferredExecutor : null)的Runnable,如果需要立马显示第一个屏幕就不执行属性动画直到它的ondraw方法完成,否则执行动画
      绑定快捷图标和部件到页面bindWorkspaceItems(otherWorkspaceItems, otherAppWidgets, deferredExecutor)
      主要分析点击事件是如何绑定所以就到这里----------------
  6. mResults.bindWorkspace()
    将callbacks.bindItems(workspaceItems.subList(start, start+chunkSize), false)的runnable放入调度器执行
  7. Launcher.bindItems(final List<ItemInfo> items, final boolean forceAnimateIcons)
    当item.itemType是下面这三种时:
    LauncherSettings.Favorites.ITEM_TYPE_APPLICATION:
    LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT:
    LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT:
    获取WorkspaceItemInfo info = (WorkspaceItemInfo) item;
    然后调用view = createShortcut(info);
  8. createShortcut(info)调用了
    createShortcut((ViewGroup) mWorkspace.getChildAt(mWorkspace.getCurrentPage()), info)
    createShortcut(ViewGroup parent, WorkspaceItemInfo info)
    最终给BubbleTextView绑定了onclick事件
public View createShortcut(ViewGroup parent, WorkspaceItemInfo info) {
        BubbleTextView favorite = (BubbleTextView) LayoutInflater.from(parent.getContext())
                .inflate(R.layout.app_icon, parent, false);
        favorite.applyFromWorkspaceItem(info);
        favorite.setOnClickListener(ItemClickHandler.INSTANCE);
        favorite.setOnFocusChangeListener(mFocusHandler);
        return favorite;
    }

相关文章

网友评论

      本文标题:Launcher3 快捷图标点击事件绑定-API28

      本文链接:https://www.haomeiwen.com/subject/vdmdehtx.html