[转帖]使用Android时限联网_Android, Python及开发编程讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Android, Python及开发编程讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3397 | 回复: 0   主题: [转帖]使用Android时限联网        下一篇 
wei.wang
注册用户
等级:少校
经验:1001
发帖:87
精华:0
注册:2013-8-29
状态:离线
发送短消息息给wei.wang 加好友    发送短消息息给wei.wang 发消息
发表于: IP:您无权察看 2013-9-6 11:23:02 | [全部帖] [楼主帖] 楼主

简介: Android 是面向应用程序开发的丰富平台,它提供一套出色的用户界面元素和数据管理功能。它还为开发连接到真实世界的应用程序提供了出色的网络选项。您希望连接到哪里?也许您希望告诉全世界您正在使用 Twitter。或者希望收到有关在本地洗衣店或熟食店的排号。如果希望将 Android 连接到您所生活的世界,那么请阅读本文。




简介

本文建立在 “ 使用 Eclipse 开发 Android 应用程序” 一文的基础之上,探究了 Android 的网络功能。了解如何利用 Android 的网络选项来实现有趣、有用的东西。Android 平台非常适合 Java™ 开发人员:他们可以使用已有的技能将网络连接带到一个移动或 “嵌入式” 平台中。

在本文中,了解用于 Android 应用程序的网络选项以及基本的 Android 联网技巧。本文研究一个真实的应用程序,它在结合使用环境监视系统时需要具备联网功能。这类系统为什么如此重要?原因之一是:如果您的朋友需要外出几个星期,在他离开后,他打电话给我,让我从他家里找到某样东西并邮寄给他。我来到他的家里,发现供暖设备已经被切断并且水管已经冻裂 — 场面非常混乱。如果备有一个温度监控系统,那么就可以避免出现这类事故。本文将探查 Android 在这类监控系统中扮演的角色。






Android 联网功能

Android 基于 Linux® 内核,包含一组优秀的联网功能。如果尚未安装 Android SDK,那么需要 下载 它才能实践本文的示例。

表 1 展示了 Android SDK 中一些与网络有关的包。


表 1. Android SDK 网络包

描述

java.net

提供与联网有关的类,包括流和数据包(datagram)sockets、Internet 协议和常见 HTTP 处理。该包是一个多功能网络资源。有经验的 Java 开发人员可以立即使用这个熟悉的包创建应用程序。

java.io

虽然没有提供显式的联网功能,但是仍然非常重要。该包中的类由其他 Java 包中提供的 socket 和连接使用。它们还用于与本地文件(在与网络进行交互时会经常出现)的交互。

java.nio

包含表示特定数据类型的缓冲区的类。适合用于两个基于 Java 语言的端点之间的通信。

org.apache.*

表示许多为 HTTP 通信提供精确控制和功能的包。可以将 Apache 视为流行的开源 Web 服务器。

android.net

除核心 java.net.* 类以外,包含额外的网络访问 socket。该包包括 URI 类,后者频繁用于 Android 应用程序开发,而不仅仅是传统的联网方面。

android.net.http

包含处理 SSL 证书的类。

android.net.wifi

包含在 Android 平台上管理有关 WiFi(802.11 无线 Ethernet)所有方面的类。并不是所有设备都配备了 WiFi 功能,特别是 Android 在 Motorola 和 LG 等手机制造商的 “翻盖手机” 领域获得了成功。

android.telephony.gsm

包含用于管理和发送 SMS(文本)消息的类。一段时间后,可能会引入额外的包来来为非 GSM 网络提供类似的功能,比如 CDMA 或 android.telephony.cdma 等网络。


上表并没有列出所有包,但是可以让您清楚地意识到该平台的强大功能。下一小节将介绍一些简单的网络示例。





简单的网络示例

为了演示将 Android 连接到一个网络有多么简单,这个示例将展示如何从 Web 页面发送文本。可以 下载 本例的源代码。图 1 展示了应用程序的实际使用。


图 1. 从 Web 页面获取文本

北京联动北方科技有限公司

本节提供了构建示例应用程序所需的代码。我们将首先查看 UI 部分,然后介绍与网络有关的代码。

共有三个 UI 元素:

  • EditText 让用户能够进入一个 Web 页面(图 1 和 清单 2 所示的 http://developer.android.com)。
  • 使用一个按钮告诉程序取回 Web 页面文本。
  • 检索回数据后,它将显示在 TextView 中。

清单 1 展示了 main.xml 文件,这是该应用程序的完整 UI 布局。


清单 1. main.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:orientation="vertical"
  4.     android:layout_width="fill_parent"
  5.     android:layout_height="fill_parent"
  6.     >
  7. <EditText 
  8. android:layout_height="wrap_content"
  9. android:id="@+id/address"
  10. android:layout_width="fill_parent"
  11. android:text="http://google.com"
  12. >
  13. </EditText>
  14. <Button
  15. android:id="@+id/ButtonGo" 
  16. android:layout_width="wrap_content" 
  17. android:layout_height="wrap_content"
  18. android:text="go!"
  19. >
  20. </Button>
  21. <TextView  
  22.     android:layout_width="fill_parent" 
  23.     android:layout_height="fill_parent" 
  24.     android:background="#ffffff"
  25.     android:textColor="#000000"
  26.         android:id="@+id/pagetext"
  27.     />
  28. </LinearLayout>

复制代码

清单 2 展示了本示例使用的 Java 代码。


清单 2. GetWebPage.java

  1. package com.msi.getwebpage;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. // used for interacting with user interface
  5. import android.widget.Button;
  6. import android.widget.TextView;
  7. import android.widget.EditText;
  8. import android.view.View;
  9. // used for passing data 
  10. import android.os.Handler;
  11. import android.os.Message;
  12. // used for connectivity
  13. import java.io.BufferedReader;
  14. import java.io.InputStreamReader;
  15. import java.net.URL;
  16. import java.net.URLConnection;
  17. public class GetWebPage extends Activity {
  18.        
  19.       
  20.        Handler h;
  21.        
  22.        @Override
  23.        public void onCreate(Bundle savedInstanceState) {
  24.              super.onCreate(savedInstanceState);
  25.              setContentView(R.layout.main);
  26.              
  27.              final EditText eText = (EditText) findViewById(R.id.address);
  28.              final TextView tView = (TextView) findViewById(R.id.pagetext);
  29.              
  30.              this.h = new Handler() {
  31.                   
  32.                    @Override
  33.                    public void handleMessage(Message msg) {
  34.                          // process incoming messages here
  35.                          switch (msg.what) {
  36.                                case 0:
  37.                                tView.append((String) msg.obj);
  38.                                break;
  39.                          }
  40.                          super.handleMessage(msg);
  41.                    }
  42.              };
  43.              final Button button = (Button) findViewById(R.id.ButtonGo);
  44.              button.setOnClickListener(new Button.OnClickListener() {
  45.                    public void onClick(View v) {
  46.                          try {
  47.                                tView.setText("");
  48.                                // Perform action on click
  49.                                URL url = new URL(eText.getText().toString());
  50.                                URLConnection conn = url.openConnection();
  51.                                // Get the response
  52.                                BufferedReader rd = new BufferedReader(new 
  53.                               InputStreamReader(conn.getInputStream()));
  54.                                String line = "";
  55.                                while ((line = rd.readLine()) != null) {
  56.                                      Message lmsg;
  57.                                      lmsg = new Message();
  58.                                      lmsg.obj = line;
  59.                                      lmsg.what = 0;
  60.                                      GetWebPage.this.h.sendMessage(lmsg);
  61.                                }
  62.                          }
  63.                          catch (Exception e) {
  64.                          }
  65.                    }
  66.              }); 
  67.        }
  68. }

复制代码

这些代码可以分解成一些常见的部分。这里使用一些重要(必需)的导入语句来恰当地引用 UI、数据传递以及应用程序中使用的与网络有关的类。所有与网络相关的代码出现在  OnClickListener的  OnClick 方法中。在选择 图 1 所示的标签为  go! 的按钮之后调用这些代码。

URL 和  URLConnection 类共同提供与用户所选的 Web 站点的连接。 BufferedReader 的一个实例负责从 Web 站点连接中读取传入的数据。每读取一行代码,文本就被附加到一个 TextView。数据并没有直接指定给 TextView(但是在本例中可以)。我们引入了一种设计模式,即创建一个消息对象并将该对象发送到一个处理程序的实例。这是更新 UI 的一种比较可取的方法,对可能需要同时运行多个线程的应用程序而言尤其如此。

在示例中,Android 应用程序与 HTTP Web 服务器进行通信,比如 Apache 或 Internet Information Server(IIS 位于 Microsoft® 服务器上)。如果应用程序直接与 TCP socket 对话,那么您将以不同的方式实现应用程序。清单 3 所示的代码片段展示了另一种与远程服务器交互的方式。这个清单被实现为一个单独的线程。


清单 3. Daytime 客户机

  1.  public class Requester extends Thread {
  2.        Socket requestSocket;
  3.        String message;
  4.        StringBuilder returnStringBuffer = new StringBuilder();
  5.        Message lmsg;
  6.        int ch;
  7.        @Override
  8.        public void run() {
  9.              try {
  10.                    this.requestSocket = new Socket("remote.servername.com", 13);
  11.                    InputStreamReader isr = new InputStreamReader(this.requestSocket.
  12.                   getInputStream(), "ISO-8859-1");
  13.                    while ((this.ch = isr.read()) != -1) {
  14.                          this.returnStringBuffer.append((char) this.ch);
  15.                    }
  16.                    this.message = this.returnStringBuffer.toString();
  17.                    this.lmsg = new Message();
  18.                    this.lmsg.obj = this.message;
  19.                    this.lmsg.what = 0;
  20.                    h.sendMessage(this.lmsg);
  21.                    this.requestSocket.close();
  22.              } catch (Exception ee) {
  23.                    Log.d("sample application", "failed to read data" + ee.getMessage());
  24.              }
  25.        }
  26.  }

复制代码

与前面的示例类似,上面的代码使用消息和处理程序方法来将数据发送给调用者,调用者将更新 UI 并执行后续处理。与 清单 1 不同,这个例子并没有与 HTTP 服务器通信,因此没有使用 URLConnection 类。相反,使用了较低级的  Socket 类在端口 13 打开与远程服务器的基于流的 socket 连接。端口 13 是典型的 “Daytime Server” 应用程序。

Daytime Server 接受传入的 socket 连接并以文本的形式将日期和时间发送给调用 socket。一旦发送完数据,服务器将关闭 socket。示例也展示了  InputStreamReader 的使用和一个特定字符编码。

发送文本消息是您需要使用 Android 完成的另一项任务。清单 4 展示了一个示例。


清单 4. 发送一条文本消息

  1. void sendMessage(String recipient,String myMessage) {
  2.       SmsManager sm = SmsManager.getDefault();
  3.       sm.sendTextMessage("destination number",null,"hello there",null,null);
  4. }




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论