Подтвердить что ты не робот

Альтернатива Intent.FLAG_ACTIVITY_CLEAR_TASK

У меня есть два приложения App-B запускает App-A. Если пользователь запускает приложение B изнутри приложения A, я заканчиваю на App-A, поэтому у меня нет проблем.

Если пользователь переходит прямо в приложение B из ящика приложения или долгое нажатие домашней кнопки, я реализую ниже, который сначала очищает задачу в приложении A, прежде чем применять все дополнительные функции. Это имеет желаемый аффект, но работает только с API 11. На более низких API-интерфейсах новая задача в APP-A не изменится, и дополнительные функции putExtra не будут иметь никакого эффекта. Любая альтернатива FLAG_ACTIVITY_CLEAR_TASK? для API <= 10 <

        Intent i = new Intent("com.App-A");
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);

Спасибо

Джейсон

4b9b3361

Ответ 1

Новый IntentCompat должен был помочь, но, по-видимому, флаг игнорируется для API ниже 11.

Чтобы использовать IntentCompat, выполните следующие действия:

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);

Ответ 2

это будет работать правильно

i.addFlag(Intent.FLAG_ACTIVITY_NO_HISTORY | 
               Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);

Ответ 4

Возможно, я ошибаюсь в понимании того, о чем вы спрашиваете, но разве при запуске B вы хотите, чтобы A был убит?

В A добавьте это в тег активности в манифесте:

android:noHistory=true

Это приведет к удалению активности из памяти, как только она потеряет фокус.

Ответ 5

У меня все еще много проблем с пониманием проблемы, но я хочу помочь вам исправить это. Поскольку комментарии допускают только 600 символов и не форматируются хорошо, я собираюсь создать ответ вместо этого, потому что я уверен, что вместе мы сможем решить эту проблему.

Я хотел бы иметь возможность воспроизвести вашу проблему. Для этого я создал 2 приложения: AppA и AppB. AppA имеет одно действие под названием ActivityA, а AppB имеет одно действие под названием ActivityB. Оба ActivityA и ActivityB используют android:launchMode="singleTask".

ActivityA имеет кнопку на нем, которая запускает AppB и заканчивается, например:

    Intent intent = new Intent("de.sharpmind.example.AppB");
    intent.putExtra("extra", "launched from AppA");
    startActivity(intent);
    finish();

ActivityB имеет кнопку на нем, которая запускает AppA следующим образом:

    Intent intent = new Intent("de.sharpmind.example.AppA");
    intent.putExtra("extra", "launched from AppB");
    startActivity(intent);

Все это работает, как я ожидаю. AppA и AppB работают в разных задачах. "Дополнительно" правильно рассматривается в методах onCreate() для каждого приложения.

Итак, не могли бы вы рассказать мне больше о вашей проблеме. Как я могу точно воспроизвести вашу проблему? Вы писали:

В более низких API-интерфейсах новая задача в APP-A не изменится, а extres putExtra не будет иметь эффекта.

Что вы подразумеваете под этим? Где вы размещаете дополнительные услуги, и где вы их получаете и что вы ожидаете?

Кроме того, что означает launchMode вашего AppB?

Кроме того, если у вас есть эта проблема, существуют ли другие действия в стеке задач для AppA?

Пожалуйста, предоставьте дополнительную информацию в исходном вопросе или здесь в качестве комментариев.

Ответ 6

Использование FLAG_ACTIVITY_CLEAR_TASK очищает задний стек. Если я правильно понимаю, это поведение, которое вы хотите.

Использование singleInstance вместо singleTask в вашем манифесте сделает это.

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

Так как launchMode не может быть изменен программно, а FLAG_ACTIVITY_CLEAR_TASK недоступен для API <= 10, вам может потребоваться создать два идентичных действия.

Один с launchMode=singleTask и один с launchMode=singleInstance.

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

 <category android:name="android.intent.category.LAUNCHER" />