【问题标题】:How to pass message to Bluetooth Activity from another activity如何将消息从另一个活动传递给蓝牙活动
【发布时间】:2016-04-13 00:26:28
【问题描述】:



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

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

问题:

1. 如何将Direction Activity中的字符发送到蓝牙Activity?
2.蓝牙Activity收到字符后如何通过蓝牙连接发送?
3. 我需要“ConnectThread”和“ConnectedThread”两个类来连接和发送还是只需要其中一个?

PS。我是初学者,我尝试了很多东西,比如意图、共享偏好和捆绑。但是每次我尝试都会发生错误。

【问题讨论】:

  • 对于您的第一个问题,使用意图并在意图调用中传递适当的数据
  • 您的第二个问题:您通常将值写入特征或服务。这些是 Android 提供的蓝牙 LE 示例项目中演示的非常基本的原则。问题 3 也是如此。也许您应该先阅读该内容,或者提供一些您尝试过的代码。
  • @Zimano 根据 ConnectThread 和 ConnectedThread 的提及,我相信他使用的是经典蓝牙而不是 BLE。这个谷歌指南解释了一切,但使用了一种几乎不可读且太长的模式,而不是专注于最重要的部分。这是我今天看到的第二个提到本指南的问题,当我从头开始使用它时,我自己也遇到了麻烦,对蓝牙一无所知......
  • @Mackovich 我明白你来自哪里,我不应该仅仅根据假设发表评论。但是,为了捍卫该 Google 指南;当我第一次开始使用蓝牙时,我确实发现它实际上非常有用!估计因人而异吧。但是,我确实同意该指南很难通过,哈哈。
  • @Zimano 是的,您是对的,因为本指南为您使用既充当客户端又充当服务器的应用程序所需的一切奠定了基础。用这种奇怪的 Thread 子类化方式很难理解一切^^

标签: android android-intent android-activity android-bluetooth android-handler


【解决方案1】:

好吧,让我们暂时简化一下。

正如@Zimano cmets 所说:

  1. 您可以像尝试过的一样使用intents来共享基本数据 (字符串,整数,浮点数,字节)之间的活动,即 在Android中最常见的方式。更多详情:https://stackoverflow.com/a/19287072/3535408
  2. 如果您需要通过蓝牙连接发送数据,您必须 如果您实施了 Google 的,则可以访问 ConnectedThread 解决方案。但如果你是初学者,你会说你是(其实不是 问题或错误)注意 Android Activity 有一个life cycle。这基本上意味着在某些时候 Activity 是 创建开始停止,最后彻底毁灭。因此,如果 您在 Activity 中启动了连接和连接线程 而你切换到另一个Activity,有高不可免 这些线程将被杀死作为启动的 Activity 的风险 他们被摧毁以释放资源(非常重要 Android 生态系统)。

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

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

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

在第二种情况下,将相同的代码移动到服务中。服务是 Android SDK 的一部分,是实现您想要实现的目标的必经之路。但是有绑定到一个活动。根据我的经验,我没有处理很多服务,所以我不确定您是否可以随意绑定/取消绑定 Android 服务,而不会在您在活动之间切换时单独停止蓝牙线程。更多细节在这里:http://developer.android.com/intl/es/guide/components/services.html

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

【讨论】:

  • 可靠的答案;我喜欢你提供了两种解决方案供 OP 尝试。 Intents 也用于蓝牙示例项目中来传递东西,因此如果 OP 将使用此指南/示例项目,这非常适合。
【解决方案2】:

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

P.S 我想提一件事,我读到了“服务”,它是正确的方式。但我以其他简单的方式做到了。

我有两个活动 (1) 蓝牙搜索活动和 (2) 方向活动。

我的问题是我试图在活动 (1) 中执行所有蓝牙 stuuf,只是将命令从活动 (2) 发送到 (1),这会将其发送到遥控车。这是问题,因为正如@Mackovich 所说,该活动可能被破坏

我解决了什么问题?

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

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


1. UUID(我们听说过)。
2。目标蓝牙设备的 MAC 地址。 (我们从活动(1)中得到它)。

所以,首先我们需要蓝牙适配器、阵列适配器(用于隐藏找到的设备的信息)和广播接收器。

//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();
            }
        }
    };

然后,在用户选择列出的设备之一后。我们将获取设备的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);
            }
        });

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

这是针对原始帖子中的问题(1)。

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

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

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

我希望这会对其他人有所帮助。如果有人发现这有任何问题,请注意。请告诉我纠正它。

谢谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-29
    • 1970-01-01
    相关资源
    最近更新 更多