Так что я действительно запутался в том, как все это сделать, и я надеялся, что кто-нибудь может немного сломать это для меня.
У меня есть служба, которая всегда должна работать, и в определенное время она должна предупреждать пользователя о том, что задача должна быть выполнена (возможно, через значок панели уведомлений). Когда пользователь принимает задачу, служба должна заглянуть в локальную базу данных, построить некоторые не примитивные объекты и передать их активности, которую она только что запустила.
Я просмотрел все и очень запутался в правильном подходе, поэтому у меня есть несколько вопросов, которые помогут мне обдумать это.
Если действие создает локальную базу данных SQLite, могут ли служба и действия этого приложения обращаться к этой же базе данных позже?
Должны ли услуга и деятельность находиться в одном пакете или в отдельных пакетах? Я бы подумал, что нет, но по какой-то причине я помню, что видел что-то об этом в другом месте.
Как мне сделать передачу данных от службы к активности? Я думал о поставщике контента, но кажется, что для службы должен быть более простой способ просто передавать данные. Подобно намерению, но для не примитивов.
Заранее спасибо.
Ответ 1 · рейтинг 12 · magaio
Если классы Service и Activity находятся в одном пакете, я считаю, что они должны иметь доступ к одному и тому же частному хранилищу.
Я бы поместил их в один и тот же пакет, поскольку они являются частью одной и той же общей структуры приложения.
Объедините данные в дополнения 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 в приложении, над которым я работаю. Служба проверяет наличие обновлений на сервере и, по сути, делает то, что вы хотите сделать. Это все довольно простые вещи.