У меня есть несколько действий и служба намерений, которая обрабатывает входящие сообщения GCM.

Прямо сейчас для каждого нажатия я отправляю уведомление, и после того, как пользователь нажимает на него, он перенаправляется на соответствующий экран.

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

Есть идеи, как это реализовать?

У меня есть 2 идеи, но ни одна из них не идеальна:

  • Отслеживайте каждое действие в приложении, если действие отображается, не показывать уведомление, но отправляет намерение для действия (не лучшее решение)
  • зарегистрировать / отменить регистрацию второго широковещательного приемника в каждом действии onResume / onPause, "поймать" входящую широковещательную рассылку GCM (я не уверен, возможно ли это).

Какие-нибудь другие решения?

9
kmalmur 7 Апр 2014 в 14:45

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 он регистрирует приемник, который показывает диалог и прерывает трансляцию. Если активность не активна, то ваш получатель по умолчанию показывает уведомление.

0
Alexander Sukharev 10 Апр 2014 в 23:58
Я не хотел использовать первое решение по причине, которую вы упомянули. Второе решение кажется многообещающим, я проверю его
 – 
kmalmur
11 Апр 2014 в 19:14
Трансляции GCM действительно заказаны! Спасибо
 – 
kmalmur
14 Апр 2014 в 14:03

Возможное решение (идея 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
  }
}

Надеюсь, это поможет!

3
Daan Oerlemans 7 Апр 2014 в 15:51
Ну, на самом деле я пытался избежать этого. Если у вас есть пара Активностей, код усложняется, а также есть переход при переключении Активностей. Если толчок поступает в этом состоянии, он может быть обработан неправильно.
 – 
kmalmur
8 Апр 2014 в 12:49