При желании запуск действий и использование уведомлений от служб в Android.Запускайте или уведомляйте только если присутствует определенное приложение - PullRequest
5 голосов
/ 06 января 2012

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

Intent dialogIntent = new Intent();
    dialogIntent.setClassName(service.getBaseContext(), "com.mycompany.receiver.ui.DialogActivity"); // names changed to protect the innocent
    dialogIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
    dialogIntent.putExtra("message", message);
    service.getApplicationContext().startActivity(dialogIntent);

Исключение предупреждает о "неизвестной активности" и "вы проверили манифест".Теперь, это не вызвано тем, что я не помещаю активность в манифест.На самом деле, здесь действительно должно быть выброшено исключение, потому что мое приложение не имеет этой активности!Это была деятельность, написанная для оригинальной заявки.Сначала я этого не заметил, потому что этот код срабатывает только тогда, когда собранные данные находятся за пределами определенного диапазона.Я могу изменить код службы, но служба и исходное приложение должны продолжать работать, как и раньше.Просто в моем приложении я не особо заинтересован в том, чтобы отображать действия для этого конкретного сообщения (это не так важно для меня).
Я действительно думал об этом, и я мог просто бросить блок try / catchвокруг всегоНо это кажется немного хакерским.Если что-то не так в исходной паре приложение / сервис, я хочу знать об этом.Я выдвинул следующие идеи, которые мне нужны, чтобы помочь мне в правильном направлении.

  1. Есть ли у службы возможность узнать, какие приложения в настоящее время работают?
  2. Или, может быть, в настоящее время на переднем плане?
  3. Или как насчет привязки к услуге в настоящее время?

Меня интересует 1-3 (для общих знаний идля решения этой проблемы) но 2, вероятно, является наиболее полезным.В конце концов, к службе может быть привязано несколько приложений, и я не уверен, что хочу вывести оригинальное приложение на передний план поверх своего собственного только из-за этого сообщения.И наконец ... Забудьте все, что я сказал, и 4. Как бы вы решили это?

У меня та же очень похожая проблема в другом месте кода:

Intent toLaunch = new Intent();
    toLaunch.setClassName(context, "com.mycompany.receiver.ui.BankingActivity");

    toLaunch.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
    PendingIntent intentBack = PendingIntent.getActivity(context, 0, toLaunch, PendingIntent.FLAG_CANCEL_CURRENT);

    notify.setLatestEventInfo(context, title, message, intentBack);
    notifier.notify(NOTIFY_1, notify);

Этане бросает исключения;он выдает уведомление, и когда я нажимаю на него, запускается оригинальное приложение.На самом деле это может быть хорошо, но, опять же, было бы неплохо не иметь этого (или, возможно, компромисс - уведомить уведомителя, если приложение хотя бы связано, но не обязательно на переднем плане).Мысли?

Большое спасибо, Дейв

1 Ответ

7 голосов
/ 06 января 2012

Как бы вы решили это?

Вы действительно никогда не заявляли, что такое "это". Я собираюсь догадаться, что «это»:

Как у меня служба уведомляет мою активность на переднем плане, если она есть, и в противном случае поднимает Notification (или, возможно, вообще ничего не делает)?

Для этого «этого» используйте упорядоченную трансляцию. Как я писал в сообщении в блоге, возвращаясь назад , вот рецепт для уведомления об активности на переднем плане или для поднятия Notification:

  1. Определите строку действия, которую вы будете использовать при возникновении события, которое вы хотите перейти к операции или уведомлению (например, com.commonsware.java.packages.are.fun.EVENT).

  2. Динамически зарегистрируйте BroadcastReceiever в своей активности с IntentFilter, установленным для вышеупомянутой строки действия, и с положительным приоритетом (приоритет фильтра по умолчанию - 0). Этот получатель должен затем заставить действие делать все, что ему нужно для обновления пользовательского интерфейса на основе этого события. Получатель должен также позвонить abortBroadcast(), чтобы другие люди не могли его получить. Обязательно зарегистрируйте приемник в onStart() или onResume() и отмените регистрацию приемника в соответствующем методе onStop() или onPause().

  3. Зарегистрируйте в манифесте BroadcastReceiver с <intent-filter>, установленным для вышеупомянутой строки действия. Этот приемник должен поднять Notification.

  4. В вашем сервисе (например, IntentService), когда происходит событие, позвоните sendOrderedBroadcast().

Если вы просто хотите уведомить об одном из ваших действий на переднем плане, но ничего не делать, если оно не на переднем плане, пропустите шаг № 3.

Вот пример проекта , который демонстрирует это.

Есть ли у службы способ узнать, какие приложения в данный момент запущены?

Вы можете спросить ActivityManager, но, честно говоря, это требует хрупкого приложения.

Или, может быть, в настоящее время на переднем плане?

Ненадежно.

Или как насчет привязанного к услуге в настоящее время?

Только если вы сами это отследите.

...