Поток данных между Android BroadcastReceiver, ContentProvider и Activity? - PullRequest
5 голосов
/ 19 марта 2009

Я разработал приложение, которое получает трансляцию, а затем запускает Activity, где Activity запрашивает ContentProvider который извлекает информацию из DNS в режиме реального времени.

Я хотел бы иметь возможность перемешать это так, чтобы вместо:

BroadcastReceiver.onReceive() {
  Intent intent = new Intent(...);
  intent.setData(...); // set a single String data
  context.startActivity(intent);
}

Activity.onCreate() {
  String value = intent.getData();  // get the String data
  Cursor = ContentProvider.query(search);
  ...
  setContentView(...);
}

идет:

BroadcastReceiver.onReceive() {
  Cursor = ContentProvider.query(...);
  if (cursor != null) {
     Intent intent = new Intent(...);
     // how do I pass the cursor?
     getContext().startActivity(intent);
  }
}

Activity.onCreate() {
  // how do I retrieve the cursor?
  setContentView(...);
}

т.е. если query() не возвращает никаких данных, я хочу пропустить запуск Activity и разрешить широковещательное сообщение проваливаться как обычно.

Если query() возвращает данные, я хочу, чтобы Cursor был предоставлен Activity, так что мне больше не нужно запрашивать данные.

В свою очередь, Activity имеет собственный пользовательский интерфейс, на который пользователь должен ответить.

Возможно ли это?

Ответы [ 2 ]

6 голосов
/ 19 марта 2009

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

BroadcastReceiver.onReceive() {
  Intent intent = new Intent(...);
  intent.setData(...); // set a single String data
  context.startActivity(intent);
}

Activity.onCreate() {
  String value = intent.getData();  // get the String data
  Cursor = ContentProvider.query(search);

  if(cursor.isEmpty() ...){
    finish();
    return;
  }
  ...
  setContentView(...);
}

Это будет иметь точно такой же эффект, курсор будет загружен только один раз, и действие будет отображаться, только если что-то существует в курсоре. Единственная дополнительная нагрузка заключается в том, что намерение увольняется несмотря ни на что, но это не совсем обременительно :)

Обратите внимание, что не будет никакого мерцания или чего-либо еще, Android обрабатывает случай вызова финиша в onCreate () (я считаю, что onStart и onResume также), так что пользователь никогда не узнает, что это произошло.

0 голосов
/ 19 марта 2009

Вам нужно будет найти или создать курсор, который будет сериализуемым или разбираемым (а затем используйте intent.setExtra ()). Или, возможно, вместо этого можно прочитать все данные как посылку и передать их в действие?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...