如何管理(连接,读取,写入,断开)通过配置更改持续存在的蓝牙连接?
首选使用ActionBarSherlock兼容设备版本2.2“Froyo”的解决方案.
问题…
>无论是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示例使用服务.服务似乎侧重于进程间通信以及持续超出活动生命周期的需要.我不需要这些功能.
更新2
As pointed out by Reuben,Fragment.setRetainInstance(bool)
已替换已弃用的getLastNonConfigurationInstance().在这一点上,似乎最好的选择是使用setRetainInstance(true)创建一个持久的非UI片段.
解决方法
我要做的是覆盖onRetainNonConfiguration()以返回’this’,即对死活动实例的引用,然后从onCreate()复制你需要的对象refs,即:
Object obj = getLastNonConfigurationInstance(); if (obj != null) { MyActivity deadActivity = (MyActivity)obj; this.foo = deadActivity.foo; this.bar = deadActivity.bar; ... }
或者你可以使用服务,但我个人不喜欢它们.毫无疑问,对于执行跨进程的东西很有用,但除此之外,它们是寻找问题的解决方案.
最后,作为一般性的程序问题,您可以安全地将“全局”数据填充到您的应用程序上下文中.为此,您将android.app.Application子类化并使用< application android:name =“MyApp”>清单中的属性.在此处保留对全局静态数据中的Application对象的引用是有用的,因此AsyncTasks和其他无上下文代码总是可以到达Application上下文而无需无理由地传递Context参数.
class MyApp extends Application { ... public static MyApp context; ... @Override public void onCreate() { super.onCreate(); context = this; ... set up global data here ... } ... }