Android: передача данных между сервисом и активностью - PullRequest
18 голосов
/ 20 сентября 2010

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

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

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

  1. Если действие создает локальную базу данных SQLite, может ли служба и действия этого приложения получить доступ к этой же базе данных позже?

  2. Служба и деятельность должны быть в одном и том же или отдельных пакетах? Я бы подумал, что нет, но по какой-то причине я помню кое-что об этом в другом месте.

  3. Как бы я передал данные из сервиса в активность? Я думал о поставщике контента, но, похоже, у сервиса должен быть более простой способ передать данные. Похож на Intent, но не для примитивов.

Заранее спасибо.

Ответы [ 2 ]

12 голосов
/ 20 сентября 2010
  1. Если классы Service и Activity находятся в одном пакете, я считаю, что они должны иметь доступ к одному и тому же частному хранилищу.

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

  3. Объедините данные в дополнительные элементы Intent в виде пар ключ-значение и запустите действие.


Intent intent = new Intent(this, SecondActivity.class);
Bundle b = new Bundle();

// see Bundle.putInt, etc.
// Bundle.putSerializable for full Objects (careful there)
b.putXXXXX("key", ITEM);  
intent.putExtras(b);
startActivity(intent);

// -- later, in Activity
Bundle b = this.getIntent().getExtras();
int i = b.getInt("key");
4 голосов
/ 20 сентября 2010

В одном приложении службы и действия могут обращаться к одной и той же базе данных Sqlite. Я бы предложил использовать БД sqlite. Для простоты настройте подключение к службе как локальное, чтобы вам не нужны интерфейсы AIDL и средства межпроцессного взаимодействия.

Из службы, чтобы уведомить пользователя, используйте NotificationManager. Вы можете передать сериализуемый объект из вашего сервиса в намерение, а затем в начавшееся действие, но я бы предложил вместо этого передать идентификатор БД.

Мы создали новый инструмент Android ORM, который вы можете использовать для этого. Он включает прототипы классов Activity и Service, которые вы можете использовать для создания своего приложения. У меня пока нет примера приложения, которое использует сервис, но я напишу его в следующий раз и получу его как можно скорее.

См ...

http://ormlite.com/

А мой блог ...

http://touchlabblog.tumblr.com/

В настоящее время я делаю довольно тяжелые вещи в приложении, над которым работаю. Служба проверяет наличие обновлений на сервере и, по сути, делает то, что вы ищете. Все довольно просто.

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