问题:
如何管理(连接、读取、写入、断开连接)通过配置更改持续存在的蓝牙连接?
首选与设备版本 2.2“Froyo”兼容的解决方案,使用 ActionBarSherlock .
问题...
BluetoothDevice
和BluetoothSocket
都不能保留在onSaveState
中。为了keep my app responsive , 12 秒阻塞调用
BluetoothSocket.connect()
必须在单独的线程上进行。启动Runnable
是对长任务进行线程化的推荐方法,但它是试图在配置更改时恢复的噩梦。官方文档指出了三种不同的解决方案。使用
getLastNonConfigurationInstance()
,已弃用(严重吗?!)。将
android:configChanges="keyboardHidden|orientation"
设置为BluetoothChat Sample .但是,这并未考虑所有类型的配置更改。取消并重新启动任务,例如 Shelves Example .在这种情况下,这可能会再浪费 12 秒。
更新 1
进一步的研究使我找到了 asyncTaskLoader , 但似乎只能在完成时更新 UI,而不能提供更新。
BluetoothHDP 示例使用服务。服务似乎专注于进程间通信以及在 Activity 生命周期之外持续存在的需要。我不需要这些功能中的任何一个。
更新 2
As pointed out by Reuben , Fragment.setRetainInstance(bool)
已替换已弃用的 getLastNonConfigurationInstance()
。在这一点上,最好的选择似乎是使用 setRetainInstance(true)
制作一个持久的非 UI fragment 。
最佳答案
我会通过使用处理蓝牙连接的Service
来解决这个问题,并使该服务返回给您的 Activity,如 this answer. 中所述。
然后,您可以使用 ASyncTask 来简单地显示/隐藏对话框,并在旋转时取消/重新启动 ASyncTasks,正如您提到的那样,这是由 Shelves Example
完成的。
服务并没有那么可怕,可能是解决您问题的最佳工具。
关于java - 如何通过配置更改在 Android 上管理蓝牙连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15465817/