Intereting Posts
Настройка фонового изображения webview на графический ресурс в Android Подумайте о добавлении android: paddingStart = "25dp", чтобы лучше поддерживать макеты справа налево Ошибка Не удалось сгенерировать предпочтения, класс java / lang / AutoCloseable не найден в C: \ Program Files (x86) \ Android \ android-sdk \ platform \ android-19 \ android.jar Не удается найти запись в Keystore. Но я знаю, что там Android Как показывать ссылки в веб-виде? Избежать потери данных из-за прерывания при сохранении файлов на Android? Текст макета раздвижной вкладки в верхнем регистре Нарисовать текст поверх растрового изображения не удалось Как изменить цвет панели прогресса в Android? – (я пробовал в одном направлении, и он не работает) Android OverlayItem.setMarker (): изменение маркера для одного элемента Получить язык в андроиде? SetPreviewDisplay и setDisplayOrientation Размер Layer-List для Android LayerDrawable Как программно загружать изображения из папки mipmap? Как загрузить одинаковое предпочтение экрана в деталях PreferenceFragment

Предотвратите несколько экземпляров моего приложения Android, состоящего из одного действия

У меня есть приложение для Android, которое состоит из одного Activity . Как я могу заверить, что только один экземпляр моего приложения (== Activity ) будет существовать в данный момент времени? Я попал в ситуацию, когда мне удалось открыть несколько экземпляров моего приложения, щелкнув значок приложения несколько раз (это не воспроизводится все время).

Solutions Collecting From Web of "Предотвратите несколько экземпляров моего приложения Android, состоящего из одного действия"

Измените свой манифест следующим образом:

  <activity android:name="com.yourpackage.YourActivity" android:label="@string/app_name" android:launchMode="singleTask" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> 

android:launchMode="singleTask" и не будет возможности одновременно запускать несколько экземпляров вашей Activity. Подробнее см. В документах по действиям.

Принятый ответ служит своей цели, но это не лучший способ сделать это.

Вместо этого я рекомендую использовать статический AtomicInteger внутри каждой из ваших действий, например:

 //create a counter to count the number of instances of this activity public static AtomicInteger activitiesLaunched = new AtomicInteger(0); @Override protected void onCreate(Bundle pSavedInstanceState) { //if launching will create more than one //instance of this activity, bail out if (activitiesLaunched.incrementAndGet() > 1) { finish(); } super.onCreate(pSavedInstanceState); } @Override protected void onDestroy() { //remove this activity from the counter activitiesLaunched.getAndDecrement(); super.onDestroy(); } 

Итак, что случилось с принятым ответом?

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

Документы Android рекомендуют вам просто нарушать это поведение, когда это необходимо (это не так):

Внимание. Большинство приложений не должны прерывать поведение по умолчанию для> действий и задач. Если вы определили, что для вашей деятельности необходимо изменить поведение по умолчанию, будьте осторожны и не забудьте проверить удобство использования во время запуска и при навигации к нему из других действий и задач с помощью кнопки «Назад». Обязательно проверяйте поведение навигации, которое может противоречить ожидаемому поведению пользователя.

Я обнаружил, что пользователи моего приложения исчерпали память, и я изо всех сил пытался понять, почему. При попытке сделать это я обнаружил, что могу открыть несколько экземпляров своего приложения, неоднократно нажимая значок, затем «Домой», затем значок, затем «Домой». Я мог видеть, что использование памяти растет и до тех пор, пока приложение не разбилось. Прежде чем он упал, я мог нажать кнопку «Закрыть», и предыдущий экземпляр появился на фронте, это произойдет столько раз, сколько я запустил приложение.

Моим решением было добавить android:launchMode="singleInstance" в манифест. С тех пор мне не удалось открыть более одного экземпляра или свернуть приложение.