Android通信与网络功能实现指南
立即解锁
发布时间: 2025-08-24 00:17:34 阅读量: 1 订阅数: 5 

### Android 通信与网络功能实现指南
在 Android 开发中,通信和网络功能是非常重要的部分。本文将介绍如何在 Android 应用中实现 RSS 数据展示、短信收发以及蓝牙通信等功能。
#### 1. RSS 数据展示
在这个示例中,对代码进行了修改以展示一个 `ListView`,该列表将由从 RSS 源解析的项目填充。在示例里,为列表添加了一个 `OnItemClickListener`,当点击列表项时,会在浏览器中打开新闻项的链接。
当数据从 API 返回至 `BroadcastReceiver` 后,Android 内置的 `SAXParser` 会处理遍历 XML 字符串的工作。`SAXParser.parse()` 方法使用 `RSSHandler` 的实例来处理 XML,最终 `RSSHandler` 的 `feedItems` 列表将被填充。接着,接收器会遍历所有解析的项目,并将它们添加到 `ArrayAdapter` 中,以便在 `ListView` 中显示。
#### 2. 接收短信
##### 2.1 问题描述
应用程序需要对传入的短信消息做出反应。
##### 2.2 解决方案
在 API Level 1 及以上,可以注册一个 `BroadcastReceiver` 来监听传入的消息,并在 `onReceive()` 方法中处理这些消息。每当有新的短信消息传入时,操作系统会触发一个带有 `android.provider.Telephony.SMS_RECEIVED` 动作的广播 `Intent`。应用程序可以注册一个 `BroadcastReceiver` 来过滤这个 `Intent` 并处理传入的数据。
需要注意的是,接收这个广播并不会阻止系统中的其他应用程序也接收它,默认的短信应用程序仍然会接收并显示任何传入的短信。
##### 2.3 实现步骤
1. **定义 `BroadcastReceiver`**:
```java
public class SmsReceiver extends BroadcastReceiver {
private static final String SHORTCODE = "55443";
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
Object[] messages = (Object[])bundle.get("pdus");
SmsMessage[] sms = new SmsMessage[messages.length];
//Create messages for each incoming PDU
for(int n=0; n < messages.length; n++) {
sms[n] = SmsMessage.createFromPdu((byte[]) messages[n]);
}
for(SmsMessage msg : sms) {
//Verify if the message came from our known sender
if(TextUtils.equals(msg.getOriginatingAddress(), SHORTCODE)) {
Toast.makeText(context,
"Received message from the mothership: "+msg.getMessageBody(),
Toast.LENGTH_SHORT).show();
}
}
}
}
```
2. **在 `AndroidManifest.xml` 中注册 `BroadcastReceiver`**:
```xml
<?xml version="1.0" encoding="utf-8"?>
<manifest …>
<application …>
<receiver android:name=".SmsReceiver">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
</application>
<uses-permission android:name="android.permission.RECEIVE_SMS" />
</manifest>
```
重要提示:接收短信需要在 `manifest` 中声明 `android.permission.RECEIVE_SMS` 权限。
传入的短信消息通过广播 `Intent` 的额外数据以字节数组的 `Object` 数组形式传递,每个字节数组代表一个短信数据包数据单元(PDU)。`SmsMessage.createFromPdu()` 是一个便捷方法,可让我们从原始 PDU 数据创建 `SmsMessage` 对象。完成设置工作后,我们可以检查每条消息,以确定是否有需要处理或加工的有趣内容。在示例中,将每条消息的发件地址与已知的短代码进行比较,当收到匹配的消息时通知用户。
#### 3. 发送短信
##### 3.1 问题描述
应用程序需要发送短信消息。
##### 3.2 解决方案
在 API Level 4 及以上,可以使用 `SMSManager` 来发送文本和数据短信消息。`SMSManager` 是一个系统服务,负责发送短信并向应用程序提供操作状态的反馈。`SMSManager` 提供了 `sendTextMessage()` 和 `sendMultipartTextMessage()` 方法来发送文本消息,以及 `sendDataMessage()` 方法来发送数据消息。这些方法都接受 `PendingIntent` 参数,用于将发送操作的状态和消息传递状态返回给请求的目标。
##### 3.3 实现步骤
以下是一个简单的示例 `Activity`,用于发送短信并监控其状态:
```java
public class SmsActivity extends Activity {
private static final String SHORTCODE = "55443";
private static final String ACTION_SENT = "com.examples.sms.SENT";
private static final String ACTION_DELIVERED = "com.examples.sms.DELIVERED";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Button sendButton = new Button(this);
sendButton.setText("Hail the Mothership");
sendButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sendSMS("Beam us up!");
}
});
setContentView(sendButton);
}
private void sendSMS(String message) {
PendingIntent sIntent = PendingIntent.getBroadcast(this, 0,
new Intent(ACTION_SENT), 0);
PendingIntent dIntent = PendingIntent.getBroadcast(this, 0,
new Intent(ACTION_DELIVERED), 0);
//Monitor status of the operation
registerReceiver(sent, new IntentFilter(ACTION_SENT));
registerReceiver(delivered, new IntentFilter(ACTION_DELIVERED));
//Send the message
SmsManager manager = SmsManager.getDefault();
manager.sendTextMessage(SHORTCODE, null, message, sIntent, dIntent);
}
private BroadcastReceiver sent = new BroadcastReceiver(){
@Override
public void onReceive(Context context, Intent intent) {
switch (getResultCode()) {
case Activity.RESULT_OK:
//Handle sent success
break;
case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
case SmsManager.RESULT_ERROR_NO_SERVICE:
case SmsManager.RESULT_ERROR_NULL_PDU:
case SmsManager.RESULT_ERROR_RADIO_OFF:
//Handle sent error
break;
}
unregisterReceiver(this);
}
};
private BroadcastReceiver delivered = new BroadcastReceiver(){
@Override
public void onReceive(Context context, Intent intent) {
switch (getResultCode()) {
case Activity.RESULT_OK:
//Handle delivery success
break;
case Activity.RESULT_CANCELED:
//Handle delivery failure
break;
}
unregisterReceiver(this);
}
};
}
```
重要提示:发送短信需要在 `manifest` 中声明 `android.permission.SEND_SMS` 权限。
在示例中,每当用户点击按钮时,`SMSManager` 会发送一条短信。由于 `SMSManager` 是一个系统服务,必须调用静态的 `SMSManager.getDefault()` 方法来获取其引用。`sendTextMessage()` 方法接受目标地址(号码)、服务中心地址和消息作为参数。服务中心地址应为 `null`,以便 `SMSManager` 使用系统默认设置。
注册了两个 `BroadcastReceiver` 来接收将发送的回调 `Intent`:一个用于发送操作的状态,另一个用于消息传递的状态。这些接收器仅在操作进行期间注册,并在处理完 `Intent` 后自行注销。
#### 4. 蓝牙通信
##### 4.1 问题描述
希望在应用程序中利用蓝牙通信在设备之间传输数据。
##### 4.2 解决方案
在 API Level 5 及以上,可以使用引入的蓝牙 API 创建点对点连接。蓝牙是一种非常流行的无线射频技术,如今几乎所有移动设备都支持。许多用户认为蓝牙是移动设备连接无线耳机或与汽车音响系统集成的方式。然而,蓝牙也可以是开发者在应用程序中创建点对点连接的简单而有效的方法。
需要注意的是,目前 Android 模拟器不支持蓝牙。为了执行此示例中的代码,必须在 Android 设备上运行。此外,为了适当地测试该功能,需要两台同时运行该应用程序的设备。
##### 4.3 蓝牙点对点通信实现步骤
以下是一个使用蓝牙查找附近其他用户并快速交换联系信息(这里仅为电子邮件地址)的示例:
1. **配置 `AndroidManifest.xml`**:
```xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
android:versionCode="1"
android:versionName="1.0" package="com.examples.bluetooth">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".ExchangeActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-sdk android:minSdkVersion="5" />
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
</manifest>
```
重要提示:要使用这些 API,必须在 `manifest` 中声明 `android.permission.BLUETOOTH` 权限。此外,要更改诸如可发现性等设置以及启用/禁用适配器,必须声明 `android.permission.BLUETOOTH_ADMIN` 权限。
2. **创建用户界面布局 `res/layout/main.xml`**:
```xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http
```
0
0
复制全文
相关推荐









