Android: передача данных между сервисом и активностью
Итак, я очень запутался в том, как сделать все это, и я надеялся, что кто-то может немного сломать его для меня.
У меня есть служба, которая всегда должна быть запущена, и в определенные моменты она должна предупредить пользователя о том, что задача должна быть завершена (возможно, через значок панели уведомлений). Когда пользователь принимает задачу, службе необходимо заглянуть в локальную базу данных, сконструировать некоторые не примитивные объекты и передать их активности, которую она только что запустила.
Я все посмотрел и очень смутился относительно правильного подхода, поэтому у меня есть несколько вопросов, которые помогут мне обнять вокруг себя голову.
-
Если активность создает локальную базу данных SQLite, служба и действия этого приложения могут получить доступ к той же базе данных позже?
-
Нужно ли обслуживание и активность в одном и том же или отдельном пакете? Я бы подумал, но нет, но почему-то я помню, что видел что-то об этом в другом месте.
-
Как мне сделать передачу данных от службы к активности? Я думал о провайдере контента, но кажется, что служба должна просто упростить передачу данных. Подобно намерению, но не для примитивов.
Спасибо заранее.
Ответы
Ответ 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/
В приложении, над которым я работаю, в настоящее время я делаю некоторые довольно тяжелые вещи. Служба проверяет сервер на наличие обновлений и, по сути, делает то, что вы хотите сделать. Все это довольно просто.