É possível gravar no banco de dados em tempo real do firebase até reiniciar a conexão WIFI
Criei 2 aplicativos, um cliente e um servidor. Quando alguém usando oclient app escreve algo no RDB, isso aciona alguns eventos nos telefones executando oserver app quando o servidor concluir a operação solicitada pelo cliente, ela excluirá do RD
Cada aplicativo faz o que é necessário (o cliente grava e o servidor exclui entradas), o problema surge após alguma inatividade do telefone, para concluir a operação de gravação e exclusão, preciso desligar e ligar a conexão de dados wifi / móvel.
Abaixo, há um trecho de código que mostra como o aplicativo do servidor tenta se comunicar com o RDB da base de firmas para excluir a entrada que foi escrita pelo cliente, isso acontece sempre que uma chamada termina no aplicativo do servidor. BTW, o método onReceive é chamado e não acho que esse problema esteja relacionado à implementação deste código, porque tentei de várias maneiras diferentes corrigir esse problema sem sucesso.
public class CallStateReceiver extends BroadcastReceiver {
public static String prevState = TelephonyManager.EXTRA_STATE_IDLE;
private final String LOG_TAG = "CallStateReceiver";
@Override
public void onReceive(Context context, Intent intent) {
final PendingResult pendingResult = goAsync();
Task asyncTask = new Task(pendingResult, intent, context);
asyncTask.execute();
}
private static class Task extends AsyncTask {
private final PendingResult pendingResult;
private final Intent intent;
String PREFS_NAME = "MyPrefsFile";
SharedPreferences serverInfoPrefs;
String serverName;
AudioManager audioManager;
private Task(PendingResult pendingResult, Intent intent, Context context) {
this.pendingResult = pendingResult;
this.intent = intent;
serverInfoPrefs = context. getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
}
@Override
protected void onPostExecute(Object o) {
super.onPostExecute(o);
pendingResult.finish();
}
@Override
protected Object doInBackground(Object[] objects) {
Bundle bundle = intent.getExtras();
if (bundle == null) {
return null;
}
serverName = serverInfoPrefs.getString("serverName", "Servidor1");
String state = bundle.getString(TelephonyManager.EXTRA_STATE);
if (state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_IDLE)
&& !prevState.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_IDLE)) {
FirebaseDatabase.getInstance().getReference().child("servers").child(serverName).child("current")
.child("callRequest").removeValue();
audioManager.setStreamVolume(AudioManager.STREAM_VOICE_CALL, 5, 0);
MyAccessibilityService.onCallAlready = false;
}
prevState = state;
return null;
}
}
}
Ativei o log de depuração e esta linha (não tenho certeza se isso está relacionado ao problema):
03-02 18:08:55.360 10832-10840/? W/SQLiteConnectionPool: A SQLiteConnection object for database '/data/data/com.google.android.gsf/databases/gservices.db' was leaked! Please fix your application to end transactions in progress properly and to close the database when it is no longer needed.
E também encontrouist solução, mas não sei como isso se aplica ao firebase