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

Запретить новый экземпляр действия после нажатия на уведомление

приложение (не желаемое) поведение -

  • Приложено приложение
  • текст помещается в текстовое поле, а уведомление создается с помощью действия кнопки.
  • пользователь "нажимает" кнопку "домой", приложение "минимизировано", уведомление доступно в строке
  • пользователь выбирает уведомление, а приложение "максимизировано"

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

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

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);

i также присутствует в файле манифеста xml следующего тега

android:launchMode="singleTask"

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

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

Спасибо!

Дав

4b9b3361

Ответ 1

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

android:launchMode="singleTop"

Чтобы иметь некоторый фоновый код, вам нужно понимать его как Service

Ответ 2

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

Ответ 3

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

android: launchMode = "singleInstance"

Ответ 4

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

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

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

Ответ 5

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

Ответ 6

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

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

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

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)

private void sendNotification(String message) {
    Intent intent = new Intent(this, MainActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP| Intent.FLAG_ACTIVITY_SINGLE_TOP);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
            PendingIntent.FLAG_ONE_SHOT);

Ответ 7

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

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

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

намерение = новое намерение (это, StartUpActivity.class);    target.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);

Ответ 8

Это вернет приложение обратно в свою 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)

Ответ 9

вместо:

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);