如何通过配置更改在Android上管理蓝牙连接?

前端之家收集整理的这篇文章主要介绍了如何通过配置更改在Android上管理蓝牙连接?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
题:
如何管理(连接,读取,写入,断开)通过配置更改持续存在的蓝牙连接?

首选使用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片段.

解决方法

有很多解决方案.如果您没有使用Fragments,那么最简单的选项是覆盖onRetainNonConfigurationInstance().不要紧,API已被弃用,这只是因为他们希望你使用Fragments(公平地说,Fragment.setRetainInstance()使整个问题成为应该总是这样的问题).这个API很长一段时间都不会出现.

我要做的是覆盖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 ...
    }
...
}

猜你在找的Android相关文章