如何将消息从另一个 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 评论所述:
- 您可以像您尝试的那样使用intents来共享基本数据
(Strings, ints, floats, bytes) 在你的 Activity 之间,也就是
Android 中最常见的做法。此处有更多详细信息:
- 如果您需要通过蓝牙连接发送数据,您必须
如果您实现了 Google,则可以访问 ConnectedThread
解决方案。但如果你是初学者,你会说你是(但事实并非如此
问题或错误)注意 Android 活动有一个 生命周期
循环。这基本上意味着在某个时候 Activity 是
创造了,开始了,停止了,最后彻底结束了摧毁了.因此,如果
您在 Activity 中启动了 Connection 和 Connected threads
而你切换到另一个Activity,那里又高又不可避免
这些线程将被终止的风险 作为启动的 Activity
他们正在 被摧毁 以释放资源(非常重要
到 Android eco-system).
两种解决方案。一种简单但不推荐,另一种有点复杂但属于 Android SDK 和政策的一部分。
- 静态上下文或
- 服务;
第一种情况,将你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我是初学者。所以,我认为向初学者解释的最好方法是像一个人一样思考。在这种情况下,我实际上是初学者。
我希望这对其他人有所帮助。如果有人发现其中有任何错误,请。请告诉我更正它。
谢谢。
我构建了一个 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 评论所述:
- 您可以像您尝试的那样使用intents来共享基本数据 (Strings, ints, floats, bytes) 在你的 Activity 之间,也就是 Android 中最常见的做法。此处有更多详细信息:
- 如果您需要通过蓝牙连接发送数据,您必须 如果您实现了 Google,则可以访问 ConnectedThread 解决方案。但如果你是初学者,你会说你是(但事实并非如此 问题或错误)注意 Android 活动有一个 生命周期 循环。这基本上意味着在某个时候 Activity 是 创造了,开始了,停止了,最后彻底结束了摧毁了.因此,如果 您在 Activity 中启动了 Connection 和 Connected threads 而你切换到另一个Activity,那里又高又不可避免 这些线程将被终止的风险 作为启动的 Activity 他们正在 被摧毁 以释放资源(非常重要 到 Android eco-system).
两种解决方案。一种简单但不推荐,另一种有点复杂但属于 Android SDK 和政策的一部分。
- 静态上下文或
- 服务;
第一种情况,将你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我是初学者。所以,我认为向初学者解释的最好方法是像一个人一样思考。在这种情况下,我实际上是初学者。
我希望这对其他人有所帮助。如果有人发现其中有任何错误,请。请告诉我更正它。
谢谢。