Запретить новый экземпляр активности после нажатия на уведомление - PullRequest
23 голосов
/ 24 июня 2010

поведение приложения (нежелательное) -

  1. приложение запущено, некоторый текст помещается в текстовое поле, а уведомление создается с помощью действия кнопки.
  2. пользователь «нажимает» кнопку «Домой», приложение «свернуто», уведомление доступно на панели
  3. пользователь выбирает уведомление, а приложение «разворачивается»

НО - вместо исходного экземпляра запускается новый экземпляр (например, в самом новом экземпляре отсутствует исходный текст; когда закрывается последний экземпляр, остается исходный экземпляр с исходным текстом).

кодметода уведомления

Context context = getApplicationContext();
    CharSequence contentTitle = "someText1";
    CharSequence contentText = "someText2";
    Intent notifyIntent = new Intent(Intent.ACTION_MAIN);
    notifyIntent.setClass(getApplicationContext(), RadioStream.class);
    PendingIntent intent = 
       PendingIntent.getActivity(RadioStream.this, 0, notifyIntent, 0);

    notifyDetails.setLatestEventInfo(context, contentTitle, contentText, intent);
    mNotificationManager.notify(SIMPLE_NOTFICATION_ID, notifyDetails);

у меня есть также в XML-файле манифеста следующий тег

android:launchMode="singleTask"

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

Чего не хватает в коде?Какая информация с моей стороны отсутствует для устранения проблемы?

Спасибо!

Дав

Ответы [ 9 ]

20 голосов
/ 24 июня 2010

То, что вы называете «приложением», скорее всего, является Деятельностью.Чтобы не переписать его при выводе на передний план, используйте

android:launchMode="singleTop"

Чтобы иметь некоторый код, работающий в фоновом режиме, вам нужно реализовать его как Сервис

13 голосов
/ 24 июня 2010

Другой вариант - использовать setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP) на вашем Intent.

3 голосов
/ 19 мая 2011

добавьте этот флаг в ваши свойства деятельности.

android: launchMode = "singleInstance"

2 голосов
/ 23 февраля 2016

Вы можете установить PendingIntent.FLAG_CANCEL_CURRENT для PendingIntent:

PendingIntent pIntent = PendingIntent.getActivity(this, 0, intent,
            PendingIntent.FLAG_CANCEL_CURRENT);

Если действие уже существует, новое отменит и не обновит старое! Это работает для меня!

1 голос
/ 28 июня 2010

переопределено как сервис - все работает как положено

0 голосов
/ 23 января 2018

Это вернет приложение к его MainActivity , даже если оно открыло дочерние действия. Детские мероприятия также очищены.

AndroidManifest:

android:launchMode="singleTop"

Код:

val intent = Intent(context, MainActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP)
val pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT)
0 голосов
/ 18 января 2017

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

1) добавить режим запуска в файле манифеста android: launchMode = "singleInstance"

2) set setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP) при создании намерения.

intent = new Intent (это, StartUpActivity.class); intent.addFlags (Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);

0 голосов
/ 15 мая 2016

Я использовал пример GCM в качестве базового кода для личного проекта, и я столкнулся с той же проблемой, описанной сверху.Пример GCM: https://github.com/googlesamples/google-services/tree/master/android/gcm/app/src/main/java/gcm/play

Я нашел решение, объединив в ответы:

1) Из ответа @ognian, добавив в манифест приложения в разделе приложения:

android: launchMode = "singleTop"

<application
    android:allowBackup="true"
    android:icon="@mipmap/logo"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme"
    **android:launchMode="singleInstance">**

2) Из @CommonsWare путем установки setFlags (Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP)

1016
0 голосов
/ 18 марта 2013

вместо:

notifyIntent.setClass(getApplicationContext(), RadioStream.class);
PendingIntent intent =   PendingIntent.getActivity(RadioStream.this, 0, notifyIntent, 0);

просто используйте эти строки, это поможет вам,

notifyIntent = new Intent();
PendingIntent intent= PendingIntent.getActivity(RadioStream.this, 0, notifyIntent, 0);
...