如何将消息从另一个活动传递到蓝牙活动

时间:2016-01-08 10:43:33

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



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

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

问题:

1.如何将方向活动中的角色发送到蓝牙活动? 2.蓝牙活动收到角色后如何通过蓝牙连接发送? 3.我需要两个班级" ConnectThread"和" ConnectedThread"连接和发送或只发送其中一个?

PS。我是初学者,我尝试过很多东西,比如intent,共享Preference和Bundle。但每次我尝试发生错误。

2 个答案:

答案 0 :(得分:1)

好的,让我们暂时让它变得简单。

正如@Zimano所说:

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

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

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

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

答案 1 :(得分:0)

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

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

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

我的问题是我尝试在活动(1)中执行所有蓝牙stuuf,只需将命令从活动(2)发送到(1),然后将命令发送到RC Car。这是问题,因为@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地址并将其发送到活动(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 insaid run方法中,您需要定义您创建的类ConnectedThread的对象。通过这种方式,您将传递用于连接的BluetoothSocket变量以发送数据。

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

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

我希望这会帮助别人。如果有人发现任何事情是错误的,请等一下。请告诉我纠正它。

谢谢。