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

#android #android-activity #android-widget #instance

#Android #android-активность #android-виджет #экземпляр

Вопрос:

Я хотел бы запустить свое приложение activity при нажатии кнопки в моем виджете.

Я использую этот код:

     Intent launchApp = context.getPackageManager()


        Intent launchApp = context.getPackageManager()
                .getLaunchIntentForPackage("com.sexy.code");
        launchApp.setData(Uri.parse(listItemClickIntent
                .toUri(Intent.URI_INTENT_SCHEME)));
        pIntent = PendingIntent.getActivity(context, 0, launchApp,
                PendingIntent.FLAG_UPDATE_CURRENT);
  

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

Как мне этого избежать?

Комментарии:

1. пожалуйста, ознакомьтесь с документацией по режиму запуска манифеста Android для activity

2. Режим запуска @Jesus Dimrix — не лучшая практика

Ответ №1:

Попробуйте это:

launchApp.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

Из документации для FLAG_ACTIVITY_CLEAR_TOP:

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

Этот флаг также можно комбинировать с FLAG_ACTIVITY_NEW_TASK, как в:

 launchApp.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |
                   Intent.FLAG_ACTIVITY_NEW_TASK);
  

Вы также можете использовать их по отдельности, в зависимости от желаемого поведения.

Комментарии:

1. Ответ Николая Асташонка отлично работает, есть ли какая-либо причина использовать ваш способ вместо этого?

2. FLAG_ACTIVITY_NEW_TASK работает так же, как launchMode=singleTask . Это просто вопрос предпочтений, хотите ли вы сделать это в коде или в XML.

Ответ №2:

Как насчет использования флага режима запуска:

 android:launchMode="singleTask"
  

Ваше действие должно выглядеть так:

  <activity
            android:name=".YourActivity"
            android:launchMode="singleTask"
            android:configChanges="orientation|screenSize" >
  

Комментарии:

1. это не лучшая практика, при создании фрагмента у всех была эта проблема, причина в savedInstanceState при повороте мобильного устройства он будет создавать экземпляр снова и снова, каждый раз, когда вы хотите проверить savedInstanceState != null или нет