Android - Как получить результат создания ярлыка

Глядя на пример кода здесь - я нахожу следующий комментарий озадачивающим:

// ... We assume here that the
// app has implemented a method called createShortcutResultIntent() that
// returns a broadcast intent.

Что это означает, что приложение реализовано... где эта реализация делается?

это приемник вещания? зарегистрирован на какой фильтр намерений?

это абстрактный метод? какого класса?

а затем я вижу этот пример кода - который обрабатывает совершенно другой поток (я думаю), и я снова потерялся

1 ответ

Решение

Вы можете получить обратную связь, перехватив событие трансляции, которое вы настроили во время использования. requestPinShortcut функция. Сначала вам нужен обычный вещательный приемник (в приведенном ниже коде он имеет название ShortcutReceiver). Вы даже можете использовать существующий широковещательный приемник и просто добавить новое действие, которое он должен поймать.
Позволяет действие будет "general.intent.action.SHORTCUT_ADDED" и он будет храниться в ShortcutReceiver.kInstalledAction постоянная. В этом случае в манифесте вы должны иметь:

<receiver android:name=".ShortcutReceiver" >
  <intent-filter>
    <action android:name="general.intent.action.SHORTCUT_ADDED"/>
  </intent-filter>
</receiver>

После этого вы можете использовать следующий код в упражнении для создания закрепленного ярлыка (в других местах измените это на объекте Context учебный класс):

ShortcutManager manager = this.getSystemService(ShortcutManager.class);
PendingIntent intent = PendingIntent.getBroadcast(this, 0, new Intent(ShortcutReceiver.kInstalledAction), 0);
manager.requestPinShortcut(info, intent.getIntentSender());

В этом коде info является правильным объектом ShortcutInfo учебный класс.
Вы можете обработать событие во время трансляции:

public class ShortcutReceiver extends BroadcastReceiver {
  public static final String kInstalledAction = "general.intent.action.SHORTCUT_ADDED";

  @Override
  public void onReceive(Context context, Intent intent) {

    if (kInstalledAction.equals(intent.getAction())) {
      // Handle the event after the shortcut has been added 
      Toast.makeText(context, "The shortcut has been added", Toast.LENGTH_LONG).show();
    }

  }

}

Пожалуйста, примите во внимание, что по моему опыту событие трансляции происходит после добавления ярлыка, но иногда могут быть некоторые задержки (около нескольких минут). Но может быть есть какая-то зависимость от лаунчера.

Обо всем по порядку. Неявные намерения на Android 8.0 Oreo:

Поскольку Android 8.0 (уровень API 26) вводит новые ограничения для приемников широковещания, необходимо удалить все приемники широковещания, которые зарегистрированы для неявных намерений широковещания. Оставив их на месте, вы не повредите свое приложение во время сборки или выполнения, но они не будут работать, когда ваше приложение работает на Android 8.0. Явные намерения вещания - те, на которые может ответить только ваше приложение, - продолжают работать так же на Android 8.0. Есть исключения из этого нового ограничения. Список неявных трансляций, которые все еще работают в приложениях, ориентированных на Android 8.0, см. В разделе Исключения неявных трансляций. https://developer.android.com/about/versions/oreo/android-8.0-changes

Примечание: есть некоторые исключения: https://developer.android.com/guide/components/broadcast-exceptions (очень мало)

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

Также, ShortcutManager требует API 25, поэтому мы будем использовать его совместимую версию, чтобы не дублировать код для старых и новых версий. (ShortcutManagerCompat был добавлен в версии 26.1.0)

Код для создания закрепленного ярлыка на главном экране:

public static void addShortcut(Context context, String id) {
    if(context == null || note == null)
        return;

    //there may be various Home screen apps, better check it
    if (ShortcutManagerCompat.isRequestPinShortcutSupported(context)){

        Intent shortcutIntent = new Intent(context, MainActivity.class);
        shortcutIntent.setAction(Constants.ACTION_SHORTCUT); // !!! intent's action must be set on oreo


        ShortcutInfoCompat shortcutInfo = new ShortcutInfoCompat.Builder(context, note.get_id().toString())
                .setIntent(shortcutIntent)
                .setShortLabel("MyShortcut") //recommend max 10 chars
                .setLongLabel("Long shortcut name")//recommend max 25 chars
                .setIcon(IconCompat.createWithResource(context, R.drawable.ic_shortcut))
                .build();


        //callback if user allowed to place the shortcut
        Intent pinnedShortcutCallbackIntent = new Intent(ACTION_SHORTCUT_ADDED_CALLBACK);

        PendingIntent successCallback = PendingIntent.getBroadcast(context, REQ_CODE_SHORTCUT_ADDED_CALLBACK,
                pinnedShortcutCallbackIntent,  0);


        ShortcutManagerCompat.requestPinShortcut(context, shortcutInfo, successCallback.getIntentSender());
    }

А вот код для получения трансляции в вашей деятельности, например. Обратите внимание, что этот "обратный вызов" будет вызываться только в том случае, если ваше приложение работает, получатель зарегистрирован и пользователь разрешил ярлык:

private ShortcutAddedReceiver shortcutAddedReceiver;



private void registerShortcutAddedReceiver(){
    if(shortcutAddedReceiver == null){
        shortcutAddedReceiver = new ShortcutAddedReceiver();
    }
    IntentFilter shortcutAddedFilter = new IntentFilter(ShortcutHelper.ACTION_SHORTCUT_ADDED_CALLBACK);
    registerReceiver(shortcutAddedReceiver, shortcutAddedFilter);
}


private void unregisterShortcutAddedReceiver(){
    if(shortcutAddedReceiver != null){
        unregisterReceiver(shortcutAddedReceiver);
        shortcutAddedReceiver = null;
    }
}


@Override
public void onStart() {
    super.onStart();
    registerShortcutAddedReceiver();
}

@Override
public void onStop() {
    super.onStop();
   unregisterShortcutAddedReceiver();
}


private class ShortcutAddedReceiver extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {
        Snackbar.make(view, "Shortcut added", Snackbar.LENGTH_LONG).show();
    }
}

Надеюсь это поможет!

Другие вопросы по тегам