Wenn das Programm unter Android ausgeführt wird, steuert es Slave Bluetooth (BT) -Geräte. Es hat wenige Tasten, die verschiedene Funktionen der Peer-Geräte ermöglichen.
Bluetooth ist auf dem Android-Gerät standardmäßig nicht aktiviert und die Verbindung wird nach dem Klicken auf die Schaltfläche für kurze Zeit hergestellt.
Der Fluss nach jedem Klick ist also:
startActivityForResult()
mit BT, falls nicht aktiviert) Mein Problem ist, dass, wenn BT nicht aktiviert ist, ein Aufruf von startActivityForResult()
in # 1 den Programmablauf "unterbricht". Später, wenn onActivityResult()
aufgerufen wird, möchte ich den Fluss von dem Punkt fortsetzen, an dem er "unterbrochen" wurde.
Zu diesem Zweck habe ich ein zusätzliches Member-Feld und einige Konstanten definiert und in onActivityResult()
verwendet:
Jetzt noch eine Komplikation: onActivityResult()
wird vor onResume()
der Aktivität aufgerufen. Dies ist wichtig, wenn eines der methodX()
die Sichtenhierarchie ändern muss. In meinem Fall ersetzen diese Methoden einige Fragmente, und wenn diese Operation von onActivityResult()
ausgeführt wird, wird eine Ausnahme ausgelöst.
Um dieses zusätzliche Problem zu lösen, migriert das hässliche switch
von onActivityResult()
nach onPostResume()
.
Der oben beschriebene Ansatz funktioniert, aber es ist einer der hässlichsten Codeabschnitte, die ich je geschrieben habe: methodX()
"registriert" sich selbst für "re-run", indem RERUN_METHOD_X
constant mRerunMethodIndex
, onActivityResults()
zugewiesen wird setzt ein "Rerun Flag" nachdem BT aktiviert wurde, überprüft onPostResume()
das Flag, löscht dieses Flag, löscht mRerunMethodIndex
und führt das entsprechende methodX()
erneut aus.
Gibt es einen eleganteren Ansatz (vorzugsweise auf 1 oder 2 Methoden beschränkt)?
Tags und Links android android-activity event-handling