默认情况下,Android设备上未启用蓝牙,并且在按钮单击后短时间内建立连接.
因此,每次点击按钮后的流程为:
>确保BT启用(如果没有BT启用意图的startActivityForResult())
>连接到远程设备
>启用远程设备的某些功能
>断开与设备的连接
我的问题是如果没有启用BT,那么在#1中调用startActivityForResult()会中断程序流程.之后,当调用onActivityResult()时,我想从“被破坏”的点恢复流程.
为此,我定义了额外的成员字段和少量常量,并在onActivityResult()中使用它们:
private int mRerunMethodindex = 0; private static final int RERUN_METHOD1 = 1; private static final inr RERUN_METHOD2 = 2; ... public void onActivityResult(int requestCode,int resultCode,Intent data) { switch (requestCode) { case REQUEST_ENABLE_BT: if (resultCode == Activity.RESULT_OK) { int rerunMethodindex = mRerunMethodindex; mRerunMethodindex = 0; switch (rerunMethodindex ) { case (RERUN_METHOD1): method1(); break; case (RERUN_METHOD2): method2(); break; // ... the same for other cases } } break; default: break; } }
现在,还有一个复杂问题:onActivityResult()将在activity的onResume()之前调用.如果任何methodX()需要更改视图层次结构,这将很重要.在我的例子中,这些方法替换了一些Fragments,如果从onActivityResult()执行此操作,则抛出异常.
为了解决这个额外的问题,onActivityResult()的丑陋转换迁移到onPostResume().
上面描述的方法是有效的,但它是我写过的最丑陋的代码片段之一:methodX()通过将RERUN_METHOD_X常量赋值给mRerunMethodindex来“重新运行”以“重新运行”,onActivityResults()在之后设置了一些“重新运行标志”启用BT,onPostResume()检查标志,清除此标志,清除mRerunMethodindex并重新运行相应的methodX().
解决方法
public void Runnable mMethod1 = new Runnable() { public void run() { // your code for method 1 } } public void Runnable mMethod2 = new Runnable() { public void run() { // your code for method 2 } } public void Runnable mMethod3 = new Runnable() { public void run() { // your code for method 3 } } private void startMethod(Runnable method) { mCurrentMethod = method; method.run(); } ... public vond onPostResume() { if (mCurrentMethod != null) { mCurrentMethod.run(); mCurrentMethod = null; } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。