Как я могу предотвратить создание ярлыка более одного раза?

Я написал следующий код для создания ярлыка моего приложения на главном экране:

private void createShortcut() {

        Intent shortcutIntent = new Intent(this, ActActivation.class);
        shortcutIntent.setClassName("org.mabna.order",
                "org.mabna.order.ui.ActActivation");
        shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

        Intent addIntent = new Intent();
        addIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
        addIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, "test");
        addIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,
                Intent.ShortcutIconResource.fromContext(this, R.drawable.icon));
        addIntent.setAction("com.android.launcher.action.INSTALL_SHORTCUT");
        this.sendBroadcast(addIntent);

    }

Он работает правильно, но каждый раз, когда я запускаю свою программу и запускаю этот код, я получаю сообщение «Тест ярлыка создан», и на мой домашний экран добавляется новый ярлык. После 10-кратного открытия моего приложения у меня есть 10 ярлыков.

Как я могу предотвратить это окно сообщения и создание нескольких ярлыков?


person Bobs    schedule 23.04.2013    source источник
comment
Установите boolean в SharePreferences и проверяйте при каждом запуске. Переключитесь на true при первом запуске. Самое простое, что я могу придумать.   -  person Siddharth Lele    schedule 23.04.2013
comment
@IceMAN Если пользователь очищает данные приложения, ярлык создается снова.   -  person Bobs    schedule 23.04.2013
comment
@breceivemail посмотрите на мой ответ, я столкнулся с проблемой образца, но я решил эту проблему.   -  person Ronak Mehta    schedule 23.04.2013


Ответы (3)


Создайте SharedPrefernce, а также добавьте эту строку, вам не нужны никакие другие разрешения для удаления.

addIntent.putExtra("duplicate", false);

Код после изменений

    Intent shortcutIntent = new Intent(this, ActActivation.class);
    shortcutIntent.setClassName("org.mabna.order",
            "org.mabna.order.ui.ActActivation");
    shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

    Intent addIntent = new Intent();
    addIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
    addIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, "test");
    addIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,
            Intent.ShortcutIconResource.fromContext(this, R.drawable.icon));
    addIntent.putExtra("duplicate", false); // Just create once
    addIntent.setAction("com.android.launcher.action.INSTALL_SHORTCUT");
    this.sendBroadcast(addIntent);

Это создаст только один значок на главном экране, если пользователь очистит Cache, это предотвратит создание приложением другого значка на главном экране.

РЕДАКТИРОВАНИЕ: Код протестирован в Android 4.2 (JellyBean), где он работает нормально.

person Ronak Mehta    schedule 23.04.2013
comment
addIntent.putExtra("duplicate", false); не работает на устройствах выше API 14. - person Siddharth Lele; 23.04.2013
comment
Спасибо! Хорошее решение. Как я могу предотвратить это сообщение? - person Bobs; 23.04.2013
comment
@Rstar Я проверил, и все в порядке. Но я заметил, что он не работает с некоторыми новыми API. - person Bobs; 23.04.2013

К сожалению, API не помогает предотвратить дублирование. Также нет API для просмотра того, что находится на главном экране (по крайней мере, без взлома данных лаунчера). Лучшее, что вы можете сделать, это отследить, создали ли вы уже ярлык или нет. Это проще всего сделать с общими предпочтениями. См. руководство по параметрам хранилища.

В любом случае, лучше идти по этому пути. Если вы всегда создаете ярлык, если его в данный момент не существует, вы быстро оттолкнете любого пользователя, который вручную удалил ваш ярлык.

person scottt    schedule 27.03.2014

Лучший способ сделать это — использовать SharedPreferences:

private static final String SHORTCUT = "SHORTCUT";
//...
if (!preferences.readBool(SHORTCUT, false)) {
    Intent shortcutIntent = new Intent(getApplicationContext(),
                    SomeActivity.class);

    shortcutIntent.setAction(Intent.ACTION_MAIN);

    Intent addIntent = new Intent();
    addIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
    addIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, getString(R.string.app_name));
    addIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,
                    Intent.ShortcutIconResource.fromContext(getApplicationContext(),
                            R.drawable.app_icon));
    addIntent.putExtra("duplicate", false);

    addIntent.setAction("com.android.launcher.action.INSTALL_SHORTCUT");
    getApplicationContext().sendBroadcast(addIntent);

    SharedPreferences.Editor edit = preferences.edit();
    edit.putBoolean(SHORTCUT, true);
    edit.apply();
}

Но если пользователь очистит данные приложения и снова запустит приложение, будет создана копия.

person Volodymyr Kulyk    schedule 23.12.2015
comment
если вы удалите кеш, вы получите дубликат :) - person ; 12.04.2016
comment
и другие приложения. Как они это делают ? - person ; 13.04.2016