Как запустить один раз экземпляр действия? - PullRequest
0 голосов
/ 24 апреля 2018

У меня есть сценарий.Я пытаюсь заблокировать свое приложение, используя PinActivity, который я создал.Я запускаю службу, которая имеет счетчик таймера на 5 минут.Если в приложении нет активности пользователя в течение 5 минут.Я покажу ему PINActivity, который он должен разблокировать, и войду в приложение.Я запускаю PINActivity следующим образом:

Intent loginIntent = new Intent(this, PINActivity.class);
loginIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(loginIntent);

Поэтому, когда пользователь возвращается к приложению и видит PINActivity, он разблокирует его и войдет в приложение.Но что делать, если пользователь не вводит ПИН-код и снова оставляет приложение идеальным для более чем 5 минут (Примечание: моя служба запускает таймер счетчика в тот момент, когда пользователь выводит приложение на передний план).Я не хочу добавлять несколько экземпляров одного и того же PINActivity вверху.Как я могу убедиться, что у меня только один PINActivity наверху?

Ответы [ 6 ]

0 голосов
/ 24 апреля 2018

Вы должны использовать FLAG_ACTIVITY_SINGLE_TOP.Это предотвратит запуск Android PINActivity, если в стеке уже есть экземпляр PINActivity.

Intent loginIntent = new Intent(this, PINActivity.class);
loginIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_SINGLE_TOP);
startActivity(loginIntent);

Пожалуйста, не пытайтесь использовать специальные режимы запуска, такие как singleTask или singleInstance как предлагали другие.Это не поможет и усложнит проблему для вас.

Вы также можете указать android:launchMode="singleTop" в записи манифеста для PINActivity.Это имеет тот же эффект, что и FLAG_ACTIVITY_SINGLE_TOP.

0 голосов
/ 24 апреля 2018

В манифесте добавить атрибут singleInstance в тег активности.

<activity 
    android:launchMode= "singleInstance" />                                 

Нажмите здесь

0 голосов
/ 24 апреля 2018

добавить android:launchMode="singleInstance" в манифест

 <activity
            android:name=".MainActivity"
            android:launchMode="singleInstance"/>
0 голосов
/ 24 апреля 2018

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

  1. singleTop Следующий режим - singleTop.Он действует почти так же, как и стандартный, что означает, что экземпляр ActivityTop можно создать столько, сколько мы хотим.Единственное отличие состоит в том, что если в Задаче вызывающей стороны уже есть экземпляр Activity с тем же типом наверху стека, то не будет создано никакого нового Activity, вместо этого Intent будет отправлено в существующий экземпляр Activity через метод onNewIntent ().

  2. singleTask Этот режим сильно отличается от стандартного и singleTop.В Activity с singleTask launchMode разрешено иметь только один экземпляр в системе (он же Singleton).Если в системе существует существующий экземпляр Activity, весь объект Task, удерживающий экземпляр, будет перемещен в верхнюю часть, а Intent будет доставлен через метод onNewIntent ().В противном случае новая активность будет создана и помещена в соответствующую задачу.

  3. singleInstance Этот режим очень близок к singleTask, в системе может существовать только один экземпляр Activity.Разница в том, что Задача удерживает это действие, может иметь только одно действие, одно экземплярное.Если из этого вида действия вызывается другое действие, автоматически создается новое задание для размещения этого нового действия.Аналогично, если вызывается операция SingleInstance, будет создана новая задача для размещения действия.

В манифесте в теле действия добавьте

android:launchMode="oneOfTheAbove"

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

<activity
    android:name=".ui.activities.PINActivity"
    android:launchMode="singleTask"/>
0 голосов
/ 24 апреля 2018

Добавить launchMode = "singleInstance" в вашей деятельности в манифесте, как это:

  <activity
   android:launchMode="singleInstance"
   android:name=".MainActivity"
                         ..... />
0 голосов
/ 24 апреля 2018

Когда вы запускаете действие, вы можете использовать это:

Intent intent = new Intent(this, MyActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(intent);

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

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