5

Opracowałem aplikację, która odbiera transmisję, a następnie uruchamia Activity, gdzie Activity wysyła zapytanie o dane, które wyciągają informacje z DNS w czasie rzeczywistym.Przepływ danych między Android BroadcastReceiver, ContentProvider i Activity?

Chciałbym móc przetasować to tak, że zamiast iść:

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(...); 
} 

idzie:

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(...); 
} 

czyli jeśli query() nie zwraca danych chcę przegapić wodowanie Activity, i pozwól na przesłanie komunikatu Broadcast jako normalnego.

Jeśli query() ma zwrócić dane, chcę że Cursor mają być dostarczone do Activity, tak że nie trzeba iść i zapytań dla danych ponownie.

Z kolei Activity ma swój własny interfejs użytkownika, na który użytkownik musi odpowiedzieć.

Czy to możliwe?

Odpowiedz

5

To, czego chcesz, jest dość trudne i dla mnie raczej nieefektywne. Proponuję, aby użyć pierwszej alternatywy, ale gdy ładujesz kursor w działaniu, sprawdź, czy nie ma danych, a następnie zakończ działanie.

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(...); 
} 

Będzie to miało dokładnie taki sam efekt, kursor zostanie załadowany tylko raz, a działanie będzie wyświetlane tylko wtedy, gdy coś znajdzie się w kursorze. Jedynym dodatkowym obciążeniem jest to, że cel jest uruchamiany bez względu na wszystko, ale to nie jest dokładnie opodatkowanie :)

Zauważ, że nie będzie migotania ani niczego, Android obsługuje przypadek wywołania zakończenia w onCreate() (Wierzę, że onStart i onResume również), aby użytkownik nigdy nie wiedział, że to się stało.

+0

OK, brzmi dobrze - ale - kiedy następuje wywołanie metody context.startActivity()? – Alnitak

+0

i jak mogę powiadomić BroadcastReceiver, czy działanie zrobiło coś pożytecznego? AFAIK Nie mogę użyć funkcji startActivityForResult() w programie BroadcastReceiver. – Alnitak

+0

Wywołanie context.startActivity natychmiast powraca, zasadniczo wszystko, co robi, planuje rozpoczęcie aktywności w późniejszym czasie, jak tylko główny wątek zdarzenia jest wolny. – sooniln

0

Musisz znaleźć lub utworzyć kursor Serializable lub Parcelable (a następnie użyj intent.setExtra()). A może można odczytać wszystkie dane jako paczkę i przekazać ją do działania?

+0

to też jest moje myślenie - prawdopodobnie Parcelable, ponieważ Activity jest w rzeczywistości ListActivity, więc muszę przekazać dane poprzez ListAdapter. – Alnitak