今天了解了一下android客户端与服务端是怎样交互的,发现其实跟web有点类似吧,然后网上找了大神的登陆示例,是基于IntentService的

1.后台使用简单的servlet,支持GET或POST。这个servlet最终返回给前台一个字符串flag,值是true或false,表示登录是否成功。

  servlet使用之前需要配置,主义servlet的servlet-name要和servlet-mapping的servlet-name一致,否则找不到路径

 我是在myEclipse上创建的一个web service 项目,然后部署到tomcat服务器上以便android客户端访问

<servlet>    <servlet-name>helloWorldservlet-name>    <servlet-class>com.zhongzhong.wap.action.HelloServletservlet-class>  servlet>  <servlet-mapping>    <servlet-name>helloWorldservlet-name>    <url-pattern>/queryOrderurl-pattern>  servlet-mapping>
import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import com.zhongzhong.wap.bean.UserBean;public class HelloServlet extends HttpServlet {  @Override  protected void doGet(HttpServletRequest req, HttpServletResponse resp)      throws ServletException, IOException {    doPost(req, resp);  }  @Override  protected void doPost(HttpServletRequest req, HttpServletResponse resp)      throws ServletException, IOException {         resp.setContentType("text/html");            PrintWriter out = resp.getWriter();            Boolean flag = false;              String userName = req.getParameter("un");            String password = req.getParameter("pw");             if(userName.equals("htp")&&password.equals("123"))          {          flag = true;          }                    else flag = false;          System.out.println("userName:"+userName+" password:"+password);          out.print(flag);            out.flush();            out.close();   }}

2.然后我是在安卓的ADT上创建一个安卓项目,

建立两个Activity,分别作为登录界面和登录成功界面。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  xmlns:tools="http://schemas.android.com/tools"  android:layout_width="match_parent"  android:layout_height="match_parent"  android:paddingBottom="@dimen/activity_vertical_margin"  android:paddingLeft="@dimen/activity_horizontal_margin"  android:paddingRight="@dimen/activity_horizontal_margin"  android:paddingTop="@dimen/activity_vertical_margin"  tools:context=".MainActivity" >  <TextView    android:id="@+id/textView1"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:layout_alignParentTop="true"    android:layout_centerHorizontal="true"    android:layout_marginTop="40dp"    android:text="HelloWorld登陆示例" />  <EditText    android:id="@+id/et_user"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:layout_below="@+id/textView1"    android:layout_centerHorizontal="true"    android:layout_marginTop="33dp"    android:ems="10"    android:hint="请输入账号" >    <requestFocus />  EditText>  <EditText    android:id="@+id/et_psw"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:layout_below="@+id/et_user"    android:layout_centerHorizontal="true"    android:layout_marginTop="40dp"    android:ems="10"    android:hint="请输入密码"    android:inputType="textPassword" />  <Button    android:id="@+id/btn_login"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:layout_below="@+id/et_psw"    android:layout_centerHorizontal="true"    android:layout_marginTop="37dp"    android:text="登陆" />RelativeLayout>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  xmlns:tools="http://schemas.android.com/tools"  android:layout_width="match_parent"  android:layout_height="match_parent"  android:paddingBottom="@dimen/activity_vertical_margin"  android:paddingLeft="@dimen/activity_horizontal_margin"  android:paddingRight="@dimen/activity_horizontal_margin"  android:paddingTop="@dimen/activity_vertical_margin"  tools:context=".NaviActivity" >  <TextView    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:layout_alignParentTop="true"    android:layout_centerHorizontal="true"    android:layout_marginTop="46dp"    android:text="登陆成功" />RelativeLayout>

3. HTTP的访问公共类,用于处理GET和POST请求

package com.example.logindemo;import java.util.ArrayList;import java.util.List;import java.util.Map;import org.apache.http.HttpResponse;import org.apache.http.NameValuePair;import org.apache.http.client.HttpClient;import org.apache.http.client.entity.UrlEncodedFormEntity;import org.apache.http.client.methods.HttpGet;import org.apache.http.client.methods.HttpPost;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.message.BasicNameValuePair;import org.apache.http.util.EntityUtils;import android.content.Entity;import android.util.Log;public class HttpUtil {  // 创建HttpClient对象  public static HttpClient httpClient = new DefaultHttpClient();  public static final String BASE_URL = "http://192.168.3.14:8090/HelloWord/";  /**   *    * @param url   *            发送请求的URL   * @return 服务器响应字符串   * @throws Exception   */  public static String getRequest(String url) throws Exception {    // 创建HttpGet对象。    HttpGet get = new HttpGet(url);    // 发送GET请求    HttpResponse httpResponse = httpClient.execute(get);    // 如果服务器成功地返回响应    if (httpResponse.getStatusLine().getStatusCode() == 200) {      // 获取服务器响应字符串      String result = EntityUtils.toString(httpResponse.getEntity());      return result;    } else {      Log.d("服务器响应代码", (new Integer(httpResponse.getStatusLine()          .getStatusCode())).toString());      return null;    }  }  /**   *    * @param url   *            发送请求的URL   * @param params   *            请求参数   * @return 服务器响应字符串   * @throws Exception   */  public static String postRequest(String url, Map rawParams)      throws Exception {    // 创建HttpPost对象。    HttpPost post = new HttpPost(url);    // 如果传递参数个数比较多的话可以对传递的参数进行封装    List params = new ArrayList();    for (String key : rawParams.keySet()) {      // 封装请求参数      params.add(new BasicNameValuePair(key, rawParams.get(key)));    }    // 设置请求参数    post.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));    // 发送POST请求    HttpResponse httpResponse = httpClient.execute(post);    // 如果服务器成功地返回响应    if (httpResponse.getStatusLine().getStatusCode() == 200) {      // 获取服务器响应字符串      String result = EntityUtils.toString(httpResponse.getEntity());      return result;    }    return null;  }}

4.

IntentService服务,用于在后台以队列方式处理耗时操作。

package com.example.logindemo;import java.util.HashMap;import android.app.IntentService;import android.content.Intent;import android.util.Log;public class ConnectService extends IntentService {  private static final String ACTION_RECV_MSG = "com.example.logindemo.action.RECEIVE_MESSAGE";  public ConnectService() {    super("TestIntentService");    // TODO Auto-generated constructor stub  }    @Override  protected void onHandleIntent(Intent intent) {    // TODO Auto-generated method stub    /**      * 经测试,IntentService里面是可以进行耗时的操作的       * IntentService使用队列的方式将请求的Intent加入队列,      * 然后开启一个worker thread(线程)来处理队列中的Intent        * 对于异步的startService请求,IntentService会处理完成一个之后再处理第二个        */      Boolean flag = false;      //通过intent获取主线程传来的用户名和密码字符串      String username = intent.getStringExtra("username");      String password = intent.getStringExtra("password");      flag = doLogin(username, password);      Log.d("登录结果", flag.toString());            Intent broadcastIntent = new Intent();      broadcastIntent.setAction(ACTION_RECV_MSG);    broadcastIntent.addCategory(Intent.CATEGORY_DEFAULT);    broadcastIntent.putExtra("result", flag.toString());      sendBroadcast(broadcastIntent);    }     // 定义发送请求的方法    private Boolean doLogin(String username, String password)    {      String strFlag = "";      // 使用Map封装请求参数      HashMap map = new HashMap();      map.put("un", username);      map.put("pw", password);      // 定义发送请求的URL      String url = HttpUtil.BASE_URL + "queryOrder?un=" + username + "&pw=" + password;  //GET方式       // String url = HttpUtil.BASE_URL + "LoginServlet"; //POST方式      Log.d("url", url);      Log.d("username", username);      Log.d("password", password);      try {        // 发送请求        strFlag = HttpUtil.postRequest(url, map);  //POST方式  //  strFlag = HttpUtil.getRequest(url);  //GET方式        Log.d("服务器返回值", strFlag);      } catch (Exception e) {        // TODO Auto-generated catch block        e.printStackTrace();      }            if(strFlag.trim().equals("true")){        return true;      }else{        return false;      }          }  }

5。

在AndroidManifest.xml中注册IntentService。注意uses-permission节点,为程序开启访问网络的权限。

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"  package="com.example.logindemo"  android:versionCode="1"  android:versionName="1.0" >  <uses-sdk    android:minSdkVersion="8"    android:targetSdkVersion="18" />  <uses-permission android:name="android.permission.INTERNET" />  <application    android:allowBackup="true"    android:icon="@drawable/ic_launcher"    android:label="@string/app_name"    android:theme="@style/AppTheme" >    <activity      android:name="com.example.logindemo.MainActivity"      android:label="@string/app_name" >      <intent-filter>        <action android:name="android.intent.action.MAIN" />        <category android:name="android.intent.category.LAUNCHER" />      intent-filter>    activity>    <activity      android:name="com.example.logindemo.NaviActivity"      android:label="@string/title_activity_navi" >    activity>    <service android:name="com.example.logindemo.ConnectService" >    service>  application>manifest>

6.登陆界面处理,注意

  1. 按钮监听事件中,使用Intent将要传递的值传给service 。
  2. 接收广播类中,同样使用Intent将要传递的值传给下一个Activity。
  3. 在onCreate()中,动态注册接收广播类的实例receiver。
  4. 在接收广播类中,不要使用完毕后忘记注销接收器,否则会报一个Are you missing a call to unregisterReceiver()? 的异常。
package com.example.logindemo;import android.os.Bundle;import android.app.Activity;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.util.Log;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;public class MainActivity extends Activity {   private static final String ACTION_RECV_MSG = "com.example.logindemo.action.RECEIVE_MESSAGE";  private Button loginBtn;  private EditText et_username;  private EditText et_password;  private String userName;  private String passWord;  private MessageReceiver receiver ;  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    initView();    //动态注册receiver      IntentFilter filter = new IntentFilter(ACTION_RECV_MSG);      filter.addCategory(Intent.CATEGORY_DEFAULT);      receiver = new MessageReceiver();      registerReceiver(receiver, filter);   }    private void initView() {    // TODO Auto-generated method stub    et_username = (EditText)findViewById(R.id.et_user);    et_password =( EditText)findViewById(R.id.et_psw);    loginBtn = (Button)findViewById(R.id.btn_login);    loginBtn.setOnClickListener(new OnClickListener() {            @Override      public void onClick(View v) {        // TODO Auto-generated method stub        if(matchLoginMsg())        {          // 如果校验成功          Intent msgIntent = new Intent(MainActivity.this, ConnectService.class);          msgIntent.putExtra("username", et_username.getText().toString().trim());          msgIntent.putExtra("password", et_password.getText().toString().trim());          startService(msgIntent);         }              }    });  }    protected boolean matchLoginMsg() {    // TODO Auto-generated method stub    userName = et_username.getText().toString().trim();    passWord = et_password.getText().toString().trim();    if(userName.equals(""))    {      Toast.makeText(MainActivity.this, "账号不能为空",Toast.LENGTH_SHORT).show();      return false;    }    if(passWord.equals(""))    {      Toast.makeText(MainActivity.this, "密码不能为空",Toast.LENGTH_SHORT).show();      return false;    }    return true;  }  //接收广播类        public class MessageReceiver extends BroadcastReceiver {      @Override      public void onReceive(Context context, Intent intent) {         String message = intent.getStringExtra("result");         Log.i("MessageReceiver", message);    // 如果登录成功        if (message.equals("true")){      // 启动Main Activity      Intent nextIntent = new Intent(MainActivity.this, NaviActivity.class);      startActivity(nextIntent);      // 结束该Activity      finish();      //注销广播接收器      context.unregisterReceiver(this);        }else{        Toast.makeText(MainActivity.this, "用户名或密码错误,请重新输入!",Toast.LENGTH_SHORT).show();       }            }        }      @Override  public boolean onCreateOptionsMenu(Menu menu) {    // Inflate the menu; this adds items to the action bar if it is present.    getMenuInflater().inflate(R.menu.main, menu);    return true;  }}

更多相关文章

  1. 万字长文带你了解最常用的开源 Squid 代理服务器
  2. 分支和循环(二)(零基础学习C语言)
  3. Nginx系列教程(一)| 手把手教你在Linux环境下搭建Nginx服务
  4. Nginx系列教程(三)| 一文带你读懂Nginx的负载均衡
  5. 阿里巴巴的FastJson数据解析介绍
  6. 微信 JSSDK 在 Android(安卓)和 iOS 的一处不一致
  7. ShareSDK 第三方分享
  8. Android(安卓)JNI配置及入门
  9. Android-电量优化

随机推荐

  1. Android(安卓)获取屏幕尺寸实例代码
  2. Android(安卓)获取手机的IMEI等设备信息
  3. android 自定义对话框 背景透明
  4. Android之checkbox使用
  5. android 获取进程名字
  6. android菜鸟
  7. android使用Intent操作拨打电话和发送短
  8. Android怎么从设置相册中的照片作背景(刚
  9. android中读取短信
  10. 第五节cocos2dx的jni部分