У меня есть несколько действий и служба намерений, которая обрабатывает входящие сообщения GCM.
Прямо сейчас для каждого нажатия я отправляю уведомление, и после того, как пользователь нажимает на него, он перенаправляется на соответствующий экран.
Я хотел бы изменить это поведение так, чтобы если приложение было видимым (любое действие находится на переднем плане), вместо уведомления отображается диалоговое сообщение (с соответствующим действием).
Есть идеи, как это реализовать?
У меня есть 2 идеи, но ни одна из них не идеальна:
- Отслеживайте каждое действие в приложении, если действие отображается, не показывать уведомление, но отправляет намерение для действия (не лучшее решение)
- зарегистрировать / отменить регистрацию второго широковещательного приемника в каждом действии onResume / onPause, "поймать" входящую широковещательную рассылку GCM (я не уверен, возможно ли это).
Какие-нибудь другие решения?
2 ответа
Я не тестировал его, но в документации говорится, что вы можете получить количество выполняемых действий для каждой задачи.
Попробуйте найти задачу вашего приложения среди текущих задач:
ActivityManager acitivityManager = (ActivityManager)
context.getSystemService(Context.ACTIVITY_SERVICE);
// Get the top of running tasks, limit by 100
List<RunningTaskInfo> tasks = acitivityManager.getRunningTasks(100);
for (RunningTaskInfo taskInfo : tasks) {
if (YOUR_PACKAGE_NAME.equals(taskInfo.baseActivity.getPackageName())) {
if (taskInfo.numRunning > 0) {
// Show dialog
} else {
// Show notification
}
break;
}
}
Google добавил примечание о getRunningTasks()
:
Примечание: этот метод предназначен только для отладки и представления пользовательских интерфейсов управления задачами. Это никогда не должно использоваться для базовой логики в приложении, такой как выбор между различными поведениями на основе информации, найденной здесь. Такое использование не поддерживается и, скорее всего, выйдет из строя в будущем. Например, если несколько приложений могут активно работать одновременно, предположения, сделанные о значении данных здесь для целей потока управления, будут неверными.
Так что используйте это на свой страх и риск.
Также проверьте, упорядочены. Если это так, вы можете "заменить" ваше значение по умолчанию BroadcastReceiver
другими в каждом действии. Просто поиграйте с приоритетом {{X1). }} с. Когда BroadcastReceiver
с более высоким приоритетом получает сообщение, он может прервать дальнейшее распространение. Для вашего приложения это означает, что при запуске некоторого Activity
он регистрирует приемник, который показывает диалог и прерывает трансляцию. Если активность не активна, то ваш получатель по умолчанию показывает уведомление.
Возможное решение (идея 1):
Чтобы определить, работает ли ваше приложение на заднем или переднем плане, вы можете просто установить логическое значение в onPause / onResume:
@Override
protected void onResume() {
super.onResume();
runningOnBackground = false;
}
@Override
protected void onPause() {
super.onPause();
runningOnBackground = true;
}
Когда вы запускаете новое намерение из уведомления, этот метод вызывается: (если вы используете singleTop), с логическим значением вы можете определить, что делать в методе onNewIntent.
@Override
protected void onNewIntent (Intent intent){
if(runningOnBackground){
//do this
}
else{
//do that
}
}
Надеюсь, это поможет!
Похожие вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.