Domanda:
Come posso gestire (collegare, leggere, scrivere, disconnettere) una connessione Bluetooth che permane attraverso le modifiche di configurazione?Come gestire una connessione Bluetooth su Android attraverso le modifiche alla configurazione?
Preferisco soluzioni che siano compatibili con la versione dispositivo 2.2 "Froyo" utilizzando ActionBarSherlock.
problemi ...
Né
BluetoothDevice
néBluetoothSocket
possono essere conservati inonSaveState
.Per il keep my app responsive, il blocco di 12 secondi
BluetoothSocket.connect()
deve essere eseguito su una filettatura separata. L'avvio di unRunnable
è il metodo consigliato per eseguire il thread di attività lunghe, ma è un incubo che tenta di ripristinare una modifica di configurazione. I documenti ufficiali indicano tre diverse soluzioni.Utilizzare
getLastNonConfigurationInstance()
, che è deprecato (sul serio ?!).Impostare
android:configChanges="keyboardHidden|orientation"
come BluetoothChat Sample. Tuttavia, questo non tiene conto di tutti i tipi di modifiche alla configurazione.Annulla & attività di riavvio come Shelves Example. In questo caso, questo potrebbe potenzialmente sprecare altri 12 secondi.
Aggiornamento 1
ulteriori ricerche mi hanno portato a asyncTaskLoader, ma sembra che questo può solo aggiornare l'interfaccia utente al termine, e non può fornire gli aggiornamenti.
campione Il BluetoothHDP utilizza un servizio. I servizi sembrano incentrati sulla comunicazione tra processi e sulla necessità di andare oltre il ciclo di vita dell'attività. Non ho bisogno di nessuna di queste funzionalità.
Aggiornamento 2
As pointed out by Reuben, Fragment.setRetainInstance(bool)
ha sostituito il deprecato getLastNonConfigurationInstance()
. A questo punto, sembra che l'opzione migliore sia quella di creare un frammento persistente non-UI usando setRetainInstance(true)
.
Vale la pena creare un singolo frammento per questa attività solo così posso usare 'setRetainInstance'? Il frammento "conservato" sarà in grado di ruotare e ridimensionarsi su un cambiamento di orientamento? Inoltre, [questa domanda SO] (http://stackoverflow.com/questions/4585627) mi ha insegnato che una sottoclasse di applicazioni NON è un modo sicuro per archiviare globals. In effetti, può portare a bachi che sono quasi impossibili da ricreare. – firyice
Re. Frammento, sì. Vale la pena abbracciare il modo di fare frammenti prima e dopo. Ri-sottoclasse l'applicazione, qualcuno è confuso. Sì, lo stato dell'attività può essere bloccato dal sistema operativo mentre il processo viene interrotto, ma allora? Application.onCreate() viene eseguito ancora quando il processo/l'attività si riavvia/riprende. –
E allora? Se il processo viene riavviato e Application.onCreate() viene chiamato, hai perso i dati in quelle variabili globali. L'unico modo che potrebbe essere ok è per le costanti. – firyice