Разделение логики и графического интерфейса в приложении Android.Сервис знает приложение и не должен - PullRequest
0 голосов
/ 28 декабря 2011

Я относительный новичок в программировании на Android (в основном я делаю C # на Windows). Я унаследовал некоторый код, который состоит из службы и приложения. Я хотел бы повторно использовать службу и некоторые приложения в другом приложении. Я кладу это в библиотеку. Все прошло хорошо, за исключением одной проблемы. Сервис имеет некоторый код, который отображает основные действия на экране. Он вызывает эту деятельность по имени. Ясно, что я не могу иметь это в общем коде. Сервисный код выглядит примерно так:

final int NOTIFY_1 = 0x1001;
NotificationManager notifier = (NotificationManager) context.getSystemService(
                    Context.NOTIFICATION_SERVICE);

final Notification notify = new Notification(
            R.drawable.icon_my_color, ticker, System.currentTimeMillis());

notify.number = 1;
notify.flags |= Notification.FLAG_AUTO_CANCEL | Notification.FLAG_SHOW_LIGHTS;
 notify.ledARGB = android.graphics.Color.CYAN;
notify.ledOnMS = 500;
notify.ledOffMS = 500;

Intent toLaunch = new Intent(context, MyBankingActivity.class);
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);

Этот код запускается службой, когда происходит что-то интересное (банковский счет становится отрицательным или что-то в этом роде). Проблема заключается в «MyBankingActivity.class», который жестко прописан выше. Я удалил MyBankingActivity из библиотеки, потому что она зависит от приложения. Однако мне нужно, чтобы старое приложение работало. Я просто хочу, чтобы он был разделен на библиотеку и приложение, чтобы я мог повторно использовать значительную логику в библиотеке в другом приложении. В этом другом приложении я не хочу получать уведомления об этом «банковское мероприятие». Даже если бы я это сделал, код в настоящее время жестко запрограммирован с именем одного вида деятельности.

Как правильно разделить логику здесь? Казалось бы, сервис должен «публиковать» событие, а заинтересованные приложения должны «подписаться». По крайней мере, с этой терминологией я знаком. Кстати, сейчас я только что закомментировал весь блок кода, и в старом приложении все отлично работает, кроме, конечно, получения этого уведомления.

Я понимаю (и извиняюсь), что мой вопрос широк. Поскольку было бы лучше «научить человека ловить рыбу, чем давать ему рыбу», пожалуйста, не стесняйтесь рекомендовать ссылки / статьи / книги, которые охватывают эту тему более широко. Я пытался посмотреть на свою ограниченную библиотеку самостоятельно, но либо мои книги слишком вводные (Android in Action - одна), либо я смотрю не в том месте. Кажется, трудно найти даже темы настройки библиотек и служб письма. На мой взгляд, есть несколько ключевых понятий, в которых я слаб: 1. Как служба передает события интересующим приложениям без знания приложения 2. Как вывести приложение на передний план на основе какого-либо сообщения, полученного от службы 3. Как взять существующее приложение и разбить его на библиотеку (для вещей, не относящихся к графическому интерфейсу или не для приложений) и приложение. 4. Как работают уведомления ....

Большое спасибо заранее, Dave

Ответы [ 2 ]

2 голосов
/ 28 декабря 2011

Может показаться, что служба должна «публиковать» событие, а заинтересованные приложения должны «подписаться».

Служба публикует событие для пользователя.

Как правильно разделить логику здесь?

Это зависит от того, как вы определяете «правильно».В этом случае я бы, вероятно, передал PendingIntent, который будет использоваться с Notification, в качестве дополнительного к Intent, который вы использовали для запуска службы.PendingIntent реализует Parcelable и, следовательно, прекрасно дополняет Intent extra.Таким образом, клиент диктует, что происходит, когда пользователь нажимает Notification - все, что нужно Service, это отображать Notification, когда это необходимо.

Как служба передает события вприложения, которые заинтересованы без знания приложения

Это не относится к вашему варианту использования, представленному здесь.Вы не передаете событие из службы в приложение.Вы сообщаете событие от службы пользователю.Пользователь не является приложением.

При этом вы можете отправить широковещательную рассылку или сделать так, чтобы клиент передал что-то дополнительно Intent, которое будет служить механизмом обратного вызова (например, PendingIntent, Messenger).

Как вывести приложение на передний план на основании некоторого сообщения, полученного от службы

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

Подход, который вы сейчас используете -отображение Notification - в большинстве случаев является правильным.

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

На это нельзя ответить абстрактно, для любой операционной системы, о которой стоит упомянуть.

Как работают уведомления .....

Это покрыто в документации и большинстве вводных книг по Android.

1 голос
/ 28 декабря 2011

это больше связано с Intent, поскольку именно строка кода фактически запускает другое действие.

У вас есть

Intent toLaunch = new Intent(context, MyBankingActivity.class);

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

Затем намерение получает пару флагов

Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP

(Короче говоря), они проверяют, что действие выводится на передний план, если оно все еще выполнялось где-то в фоновом режиме (или, если быть более точным, если оно было в стеке истории).

И затемприходит PendingIntent

PendingIntent intentBack = PendingIntent.getActivity(
    context, 0, toLaunch, PendingIntent.FLAG_CANCEL_CURRENT);

Я не очень знаком с PendingIntent, но я думаю, что он не используется здесь правильно.

Что касается ваших вопросов: 1) вы можете создавать намерения и иметь приложениязарегистрировать слушателя для них 2) это то, что делает намерение, оно говорит системе вывести это действие на передний план (или другие вещи, которые вы можете установить с помощью флагов в намерении) 3) зависит от приложения / кода

4) http://developer.android.com/reference/android/app/NotificationManager.html там вы также найдете информацию по всем другим темам

...