Android:完成丢失蓝牙连接的多项活动

时间:2012-08-15 09:20:42

标签: android bluetooth

我有一个应用程序,在主要活动中用户选择蓝牙设备并且应用程序连接到它。然后启动新活动,用户可以在不同活动之间进行选择(有不同的方式与蓝牙设备交互)。最后,所选活动已启动,用户也很满意。

我的问题是,当连接丢失时,我应该以某种方式完成活动列表活动和交互活动......但是如何?我听说Intents在活动和广播之间传递消息,甚至是助手,但没有关于如何将信息从正在运行的线程传递给多个其他活动的示例。

不同的连接线程(我从BluetoothChat示例中借用)在Application类中,因此我可以从任何活动访问写入功能。这也是我检测到丢失连接的地方。

以下是我的应用中的相关代码:

Application类:

public class BluetoothRemoteControlApp extends Application {
    public final int BT_CONNECTION_LOST = 1;

    // . . .

    private class ConnectedThread extends Thread {
        // . . .

        public void run() {
            byte[] buffer = new byte[1024];
            int bytes;

            while (true) {
                try {
                    bytes = mmInStream.read(buffer);
                    mHandler.obtainMessage(0, bytes, -1, buffer).sendToTarget();
                } catch (IOException e) {
                    e.printStackTrace();
                    // the lost connection is detected here
                    connectionLost();
                    break;
                }
            }
        }

        // . . .
    }

    private void connectionLost() {
        Log.e("BT", "Connection lost");
        // inform that connection was lost,
        // finish all activities and (re)start device select activity again
    }
}

建议使用不同的活动(称为“操作”)的活动:

public class ActionListActivity extends ListActivity {
    ArrayList<Action> activityList = new ArrayList<Action>();

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // list of available activities, arguments: title, description and class name
        activityList.add(new Action("Accelerometer Control", "Control your robot by tilting the phone", "AccelerometerControl"));
        // . . .

        setListAdapter(new ActionListBaseAdapter(this, activityList));
    }

    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);

        String activity = activityList.get(position).getClassName();

        try {
            Class<?> activityClass = Class.forName("com.bluetooth.activities." + activity);
            Intent intent = new Intent(ActionListActivity.this, activityClass);
            startActivity(intent);
        }
        catch(ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    // add a method here to finish the activity when connection is lost
}

那么让我说我启动了我的AccelerometerControl活动,在connectionLost()中添加什么内容以向ActionListActivity()AccelerometerControl()发送消息以便它们完成?

2 个答案:

答案 0 :(得分:1)

使用startActivityOnResult代替startActivity,当您想要完成活动时,请使用startActivityOnResult中使用的相同请求代码finishActivity (int requestCode)

编辑:
在Application中创建处理程序的ArrayList,并在Application类中创建静态BluetoothRemoteControlApp字段,并将其实例化为当前的Application类实例。

在每个Activity中创建一个Handler。在Activity的Onresume中,使用BluetoothRemoteControlApp的静态字段向Handler with Application注册。

一旦删除Connection,就迭代所有处理程序并发送消息。 在所有Handler中,handleMessage使用finish()。

在Onpause中从Application

中删除此处理程序

答案 1 :(得分:0)

在建立连接后启动intent.addFlags( Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET );时,您可以设置Activity之类的标记。这将允许您在重置任务时展开活动的后堆栈。