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

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

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

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

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

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

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

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


person FuegoFingers    schedule 19.09.2010    source источник


Ответы (2)


  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");
person magaio    schedule 19.09.2010
comment
что делать, если оба находятся в разных пакетах? - person Nirav; 10.12.2011
comment
@Nirav: намерение намерения = новое намерение (это, com.example.somepackage.SecondActivity.class); - person M D P; 07.07.2014

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

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

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

Видеть...

http://ormlite.com/

И мой блог...

http://touchlabblog.tumblr.com/

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

person Kevin Galligan    schedule 20.09.2010
comment
Обновлять! Я создал пример приложения со службой, которая что-то делает. Я еще не поместил его в репозиторий svn, но вы можете скачать его и попробовать. Будь осторожен. Для службы нет кнопки выключения... kagii.com/downloads/NotifyService.tar .gz - person Kevin Galligan; 20.09.2010