Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Android: передача данных между сервисом и активностью

Автор вопроса: FuegoFingersОтветов: 2

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

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

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

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

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

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

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

androidservice

Ответы

Ответ 1 · рейтинг 12 · magaio

  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");

Ответ 2 · рейтинг 4 · Kevin Galligan

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

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

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

Видеть...

http://ormlite.com/

И мой блог...

http://touchlabblog.tumblr.com/

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы