5

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

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

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 имеет собственный пользовательский интерфейс, на который пользователь должен ответить.

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

ответ

5

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

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

нормально, звучит хорошо - но - когда вызов to context.startActivity() возвращается? – Alnitak

+0

, и как я могу сообщить BroadcastReceiver, что активность сделала что-нибудь полезное? AFAIK Я не могу использовать startActivityForResult() в BroadcastReceiver. – Alnitak

+0

Вызов context.startActivity немедленно возвращается, по сути, все, что он делает, - это расписание активности, которое будет запущено позднее, как только поток основного события будет бесплатным. – sooniln

0

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

+0

это тоже мое мышление - возможно, возможно, поскольку деятельность на самом деле является ListActivity, поэтому мне нужно передать данные через ListAdapter. – Alnitak