Android GCM: другой способ обработки push в зависимости от того, видимо ли приложение или нет

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

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

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

Любая идея, как его реализовать?

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

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

Любые другие решения?

Solutions Collecting From Web of "Android GCM: другой способ обработки push в зависимости от того, видимо ли приложение или нет"

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

Попытайтесь найти задачу своего приложения среди текущих запущенных задач:

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() :

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

Поэтому используйте его на свой страх и риск.


Также проверьте, заказываются ли передачи GCM. Если это так, вы можете «переопределить» свой по умолчанию BroadcastReceiver с другими в каждом мероприятии. Просто играйте с приоритетом IntentFilter . Когда 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 } } 

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