Подтвердить что ты не робот

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

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

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

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

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

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

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

Спасибо заранее.

4b9b3361

Ответ 1

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

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

  • Свяжите данные с дополнительными функциями 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

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

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

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

См...

http://ormlite.com/

И мой блог...

http://touchlabblog.tumblr.com/

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