Запретить новый экземпляр действия после нажатия на уведомление
приложение (не желаемое) поведение -
-
Приложено приложение
- текст помещается в текстовое поле, а уведомление создается с помощью действия кнопки.
- пользователь "нажимает" кнопку "домой", приложение "минимизировано", уведомление доступно в строке
- пользователь выбирает уведомление, а приложение "максимизировано"
НО - вместо исходного экземпляра запускается новый экземпляр (например, в последнем экземпляре отсутствует исходный текст, когда последний экземпляр закрыт, все еще есть исходный экземпляр с исходным текстом).
код метода уведомления
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"
но все равно одно и то же...
Основная проблема заключается в двойной/тройной инициализации приложения, я знаю, что существуют другие средства для сохранения значений в возобновленных приложениях.
Также необходимо, чтобы приложения работали в фоновом режиме, поскольку основной функцией является потоковая передача интернет-радио.
Что не хватает в коде?
Какая информация у меня отсутствует для устранения этой проблемы?
Спасибо!
Дав
Ответы
Ответ 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);