如何将消息从另一个 activity 传递到蓝牙 Activity

How to pass message to Bluetooth Activity from another activity



我构建了一个 Android 控制遥控车的应用程序。这个应用程序有两个活动,蓝牙 Activity 和方向 Activity.

在蓝牙中activity 我使用列表视图列出所有设备并与其中一个连接。我用的是Android"ConnectThread" and "ConnectedThread"提供的两个class。我的主要工作是只将角色发送到遥控车上移动。这个角色是由方向Activity生成的,它使用加速度传感器生成一个角色。

问题:

1. 如何从方向 Activity 发送字符到蓝牙 activity?
2.蓝牙Activity收到字符后如何通过蓝牙连接发送?
3. 我需要两个 classes "ConnectThread" 和 "ConnectedThread" 来连接和发送还是只需要其中一个?

PS。我是初学者,我尝试过很多东西,比如 intent、shared Preference 和 Bundle。但是每次尝试都会出错。

好吧,我们先简单点。

如@Zimano 评论所述:

  1. 您可以像您尝试的那样使用intents来共享基本数据 (Strings, ints, floats, bytes) 在你的 Activity 之间,也就是 Android 中最常见的做法。此处有更多详细信息:
  2. 如果您需要通过蓝牙连接发送数据,您必须 如果您实现了 Google,则可以访问 ConnectedThread 解决方案。但如果你是初学者,你会说你是(但事实并非如此 问题或错误)注意 Android 活动有一个 生命周期 循环。这基本上意味着在某个时候 Activity 是 创造了开始了停止了,最后彻底结束了摧毁了.因此,如果 您在 Activity 中启动了 Connection 和 Connected threads 而你切换到另一个Activity,那里又高又不可避免 这些线程将被终止的风险 作为启动的 Activity 他们正在 被摧毁 以释放资源(非常重要 到 Android eco-system).

两种解决方案。一种简单但不推荐,另一种有点复杂但属于 Android SDK 和政策的一部分。

  1. 静态上下文或
  2. 服务;

第一种情况,将你Activity之外的所有与蓝牙相关的代码移到另一个class。将它放在静态上下文中,以便它可以在应用程序中的任何地方使用(这就是为什么它是一个非常糟糕的设计模式,但却是一个有效的设计模式......)。然后你可以随处访问你的蓝牙线程,你可以使用 write 方法发送数据;

在第二种情况下,将相同的代码移动到服务中。服务是 Android SDK 的一部分,是您想要实现的 way-to-go。但是有绑定到一个Activity。根据我的经验,我没有处理过很多服务,所以我不确定你是否可以随意 bind/unbind Android 服务而不会在活动之间切换时单独停止蓝牙线程。此处有更多详细信息:http://developer.android.com/intl/es/guide/components/services.html

无论如何,我希望我提供了足够的解释,以便您可以解决您的问题。如果您有任何问题,我会尽力回答。

@Mackovich 非常感谢您以及其他试图提供帮助的人。为了其他有同样问题的人。这是我搜索了很长时间后的解决方案。

P.S 一件事我想提一下,我读到了 "Services" 并且它是正确的方式。但是我用其他简单的方法做到了。

我有两项活动 (1) 蓝牙搜索 activity,以及 (2) 方向 activity。

我的问题是我试图在 activity (1) 中完成所有的蓝牙 stuuf,并且只是将命令从 activity (2) 发送到 (1),这将把它发送到 RC车。这是个问题,因为正如@Mackovich 所说,activity 可能会被 摧毁

我解决了什么问题?

在 activity (1) 中,我使用了 ListView 来显示蓝牙设备广播并获取这些设备信息。然后使用 Intent 将这些信息传递给 activity (2)。已连接并尝试发送 activity (1).

注意:为了建立蓝牙连接,您需要两个重要信息:


1。 UUID(我们知道)。
2。 MAC 目标蓝牙设备的地址。 (我们从 activity(1) 中得到它)。

所以,首先我们需要Bluetooth Adapter,Array Adapter(用来获取找到的设备的信息)和Broadcast Receiver。

//Declare Bluetooth Stuff
    BluetoothAdapter mBluetoothAdapter; // Make instance of the Bluetooth
    ArrayAdapter mArrayAdapter; // Array where the devices will be stored
    private static final int ENABLE_BT_REQUEST_CODE = 1;
    private static final int DISCOVERABLE_BT_REQUEST_CODE = 2;
    private static final int DISCOVERABLE_DURATION = 300;
    public static String EXTRA_ADDRESS = "Device_MAC_Address";

    //In order for the bluetooth to discover the devices that broadcasting and obtain their info.
    BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            // Whenever a remote Bluetooth device is found
            if (BluetoothDevice.ACTION_FOUND.equals(action)) {
                // Get the BluetoothDevice object from the Intent
                BluetoothDevice mBluetoothDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                // Add the name and address to an array adapter to show in a ListView
                mArrayAdapter.add(mBluetoothDevice.getName() + "\n" + mBluetoothDevice.getAddress());
            } else {
                Toast.makeText(getApplicationContext(), "No Paired Bluetooth Devices Found.", Toast.LENGTH_LONG).show();
            }
        }
    };

然后,在用户 select 列出的设备之一之后。我们将获取设备MAC地址并发送到activity(2)连接发送

//Obtain the value of the item clicked as String value
                String itemValue = (String) DevicesList.getItemAtPosition(position);
                //Extract the MAC Address from the String value above
                String MAC = itemValue.substring(itemValue.length() - 17);
                // Make an intent to start next activity.
                Intent i = new Intent(BluetoothActivity.this, NavigationActivity.class);
                //Change the activity.
                i.putExtra(EXTRA_ADDRESS, MAC); //this will be received at  NavigationActivity(class) Activity
                startActivity(i);
            }
        });

现在,我们解决了活动之间传递数据的问题。因为不需要敌人传递数据。

原post中的问题(1)。

至于问题(2)。 问题是您是否使用了 Google 提供的代码。有些事情你需要调整。在class ConnectThread insaid run 方法中,您需要定义您创建的class ConnectedThread 的对象。通过这种方式,您将传递用于连接的 BluetoothSocket 变量以发送数据。

这也解决了问题 (3)。是的,你需要两个 classes.

正如我在原文中所说Post我是初学者。所以,我认为向初学者解释的最好方法是像一个人一样思考。在这种情况下,我实际上是初学者。

我希望这对其他人有所帮助。如果有人发现其中有任何错误,请。请告诉我更正它。

谢谢。