Запуск активности из виджета и игнорирование обратного стека

#android

#Android

Вопрос:

Давайте рассмотрим простое приложение для доступа к БД с двумя действиями:

  • A — список записей из базы данных
  • B — форма ввода для ввода новых данных в БД с двумя кнопками: Сохранить / Отменить

Приложение запускается с A (список), а от пользователя может перейти к B (форма ввода).

Чтобы сделать ввод новых данных более эффективным, я создал виджет для перехода непосредственно к B (PendingIntent).

Наблюдаемое поведение приложения выглядит следующим образом:

  1. Если первым действием пользователя является виджет (пустой задний стек) => приложение открывается B, и когда пользователь нажимает Сохранить или Отменить, действие завершается, и фокус возвращается на рабочий стол Android.
  2. Если основное приложение было запущено ранее (A находится в обратном стеке) => B по-прежнему правильно открывается из виджета, однако, когда пользователь нажимает Сохранить или отменить, фокус возвращается к

Поведение, описанное в 2, нормально, когда пользователь запускает B из A. Однако я хотел бы избежать этого, когда B запускается из виджета.

Какие-либо подсказки?

Ответ №1:

У меня ситуация, когда мне нужно сделать что-то подобное. Мое быстрое решение состояло в том, чтобы добавить "EXTRA_LAUNCHED_BY_WIDGET" дополнение к намерению, запущенному виджетом. Затем в моей деятельности я рассматриваю это как особый случай.

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

   @Override
  public void onBackPressed()
  {
    Bundle extras = getIntent().getExtras();

    boolean launchedFromWidget = false;

    if (extras.containsKey("EXTRA_LAUNCHED_BY_WIDGET"))
    {
      launchedFromWidget = extras.getBoolean("EXTRA_LAUNCHED_BY_WIDGET");
    }

    if (launchedFromWidget)
    {
      // Launched from widget, handle as special case
    }
    else
    {
      // Not launched from widget, handle as normal
    }    
  }