Fluxo de dados entre Android BroadCastreceiver, ContentProvider e Atividade?
Pergunta
Eu desenvolvi um aplicativo que recebe uma transmissão e depois inicia um Activity
, onde isso Activity
Consultas a ContentProvider
que retira informações do DNS em tempo real.
Eu gostaria de poder embaralhar isso para que, em vez de ir:
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(...);
}
vai:
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(...);
}
ou seja, se o query()
não retorna dados que quero perder o lançamento doActivity
, e permita que a mensagem de transmissão seja normal.
Se o query()
Retorna dados, eu quero isso Cursor
ser fornecido ao Activity
, para que eu não precise ir e consultar os dados novamente.
Por sua vez, o Activity
Tem sua própria interface do usuário à qual o usuário precisa responder.
Isso é possível?
Solução
O que você quer é um pouco difícil e para mim, bastante ineficiente. Eu proponha que você use a primeira alternativa, mas quando você carrega o cursor na atividade, verifique se não há dados e sai da atividade.
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(...);
}
Isso terá exatamente o mesmo efeito, o cursor será carregado apenas uma vez e a atividade será exibida apenas se algo existir no cursor. A única sobrecarga extra é que a intenção é demitida, não importa o quê, mas isso não é exatamente tributário :)
Observe que também não haverá giro ou nada, o Android lida com o caso de chamada final em OnCreate () (acredito que o OnStart e o OnResume também), para que o usuário nunca saiba que isso aconteceu.
Outras dicas
Você precisará encontrar ou fazer um cursor serializável ou parcelável (e depois use o Intent.Setextra ()). Ou talvez seja possível ler todos os dados como um pacote e passar para a atividade?