Android Launcher 3はアプリケーションをインストールした後、アプリケーションアイコンの表示位置を制御します

3042 ワード

最近AndroidのLauncher開発をしていて、アプリリストを削除すると、アプリアイコンをインストールするたびに2ページ目になります.ソースコードを確認すると、インストールアプリケーションはLauncherModelのaddAndBindAddedWorkspaceAppsメソッドを実行し、ワークスペースにバインドされたアプリケーションアイコンを追加します.
public void addAndBindAddedWorkspaceApps(final Context context,
                                         final ArrayList workspaceApps) {

一方、addAndBindAddedWorkspaceAppsメソッドは、findNextavailableIconSpaceメソッドを使用して、空の場所格納アプリケーションアイコンを探します.ここで見つからないと、ページ数++になります.
// Add this icon to the db, creating a new page if necessary.  If there
// is only the empty page then we just add items to the first page.
// Otherwise, we add them to the next pages.
int startSearchPageIndex = workspaceScreens.isEmpty() ? 0 : 1;
Pair coords = LauncherModel.findNextAvailableIconSpace(context,
        name, launchIntent, startSearchPageIndex, workspaceScreens);

findNextavailableIconSpaceメソッドでは、Launcherの2番目のページから常に空の位置を探していることに気づきました.だから私はこの方法を修正して、彼に最初のページから探させました.これにより、アプリケーションをインストールした後、アイコンの配置位置を適用する問題が完璧に解決されます.
static Pair findNextAvailableIconSpace(Context context, String name,
                                                    Intent launchIntent,
                                                    int firstScreenIndex,
                                                    ArrayList workspaceScreens) {
    // Lock on the app so that we don't try and get the items while apps are being added
    LauncherAppState app = LauncherAppState.getInstance();
    LauncherModel model = app.getModel();
    boolean found = false;
    synchronized (app) {
        if (sWorkerThread.getThreadId() != Process.myTid()) {
            // Flush the LauncherModel worker thread, so that if we just did another
            // processInstallShortcut, we give it time for its shortcut to get added to the
            // database (getItemsInLocalCoordinates reads the database)
            model.flushWorkerThread();
        }
        final ArrayList items = LauncherModel.getItemsInLocalCoordinates(context);

        // Try adding to the workspace screens incrementally, starting at the default or center
        // screen and alternating between +1, -1, +2, -2, etc. (using ~ ceil(i/2f)*(-1)^(i-1))

        //           
        firstScreenIndex = Math.min(firstScreenIndex, workspaceScreens.size());
        int count = workspaceScreens.size();
        firstScreenIndex = firstScreenIndex >= 1 ? firstScreenIndex - 1 : firstScreenIndex;
        for (int screen = firstScreenIndex; screen < count && !found; screen++) {
            int[] tmpCoordinates = new int[2];
            if (findNextAvailableIconSpaceInScreen(items, tmpCoordinates,
                    workspaceScreens.get(screen))) {
                // Update the Launcher db
                return new Pair(workspaceScreens.get(screen), tmpCoordinates);
            }
        }
    }
    return null;
}