今天了解了一下androidclient与服务端是如何交互的,发现事实上跟web有点类似吧,然后网上找了大神的登陆演示样例。是基于IntentService的

1.后台使用简单的servlet,支持GET或POST。

这个servlet终于返回给前台一个字符串flag,值是true或false,表示登录是否成功。

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

我是在myEclipse上创建的一个web service 项目。然后部署到tomcatserver上以便androidclient訪问

<servlet><servlet-name>helloWorld</servlet-name><servlet-class>com.zhongzhong.wap.action.HelloServlet</servlet-class></servlet><servlet-mapping><servlet-name>helloWorld</servlet-name><url-pattern>/queryOrder</url-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 {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {doPost(req, resp);}@Overrideprotected 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" ><TextViewandroid: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登陆演示样例" /><EditTextandroid: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><EditTextandroid: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="请输入password"android:inputType="textPassword" /><Buttonandroid: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" ><TextViewandroid: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 server响应字符串* @throws Exception*/public static String getRequest(String url) throws Exception {// 创建HttpGet对象。HttpGet get = new HttpGet(url);// 发送GET请求HttpResponse httpResponse = httpClient.execute(get);// 假设server成功地返回响应if (httpResponse.getStatusLine().getStatusCode() == 200) {// 获取server响应字符串String result = EntityUtils.toString(httpResponse.getEntity());return result;} else {Log.d("server响应代码", (new Integer(httpResponse.getStatusLine().getStatusCode())).toString());return null;}}/*** * @param url*            发送请求的URL* @param params*            请求參数* @return server响应字符串* @throws Exception*/public static String postRequest(String url, Map<String, String> rawParams)throws Exception {// 创建HttpPost对象。

HttpPost post = new HttpPost(url); // 假设传递參数个数比較多的话能够对传递的參数进行封装 List<NameValuePair> params = new ArrayList<NameValuePair>(); 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); // 假设server成功地返回响应 if (httpResponse.getStatusLine().getStatusCode() == 200) { // 获取server响应字符串 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}@Overrideprotected void onHandleIntent(Intent intent) {// TODO Auto-generated method stub/** * 经測试。IntentService里面是能够进行耗时的操作的  * IntentService使用队列的方式将请求的Intent增加队列, * 然后开启一个worker thread(线程)来处理队列中的Intent   * 对于异步的startService请求,IntentService会处理完毕一个之后再处理第二个   */  Boolean flag = false;  //通过intent获取主线程传来的username与password字符串  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<String, String> map = new HashMap<String, String>();  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("server返回值", 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-sdkandroid:minSdkVersion="8"android:targetSdkVersion="18" /><uses-permission android:name="android.permission.INTERNET" /><applicationandroid:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" ><activityandroid: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><activityandroid:name="com.example.logindemo.NaviActivity"android:label="@string/title_activity_navi" ></activity><service android:name="com.example.logindemo.ConnectService" ></service></application></manifest>

6.登陆界面处理,注意

  1. button监听事件中。使用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 ;@Overrideprotected 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 stubet_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() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubif(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 stubuserName = 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(); }  }    }    @Overridepublic 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;}}

执行截图:

转载自http://blog.csdn.net/softwave

转载于:https://www.cnblogs.com/hrhguanli/p/5078428.html

Androidclient与服务端交互之登陆演示样例相关推荐

  1. 移动端报表JS开发演示样例

    近期对移动端的报表开发颇有研究,细磨精算了好久,尽管到如今还是"囊中羞涩",但决定还是先抛砖引玉,拿点小干货出来和大家分享. 研究的工具是比較有代表性的FineReport. 1. ...

  2. 【Python爬虫实战】用urllib与服务端交互(发送和接收数据)

    本文节选自<Python爬虫技术:深入理解原理.技术与开发>. urllib是Python3中内置的HTTP请求库,不需要单独安装,官方文档链接如下: https://docs.pytho ...

  3. c语言传奇引擎源码,Ei3.0服务端引擎源代码+登陆网关+客户端插件

    Ei3.0服务端引擎源代码+登陆网关+客户端插件 procedure TPANEL.Button3Click(Sender: TObject); var P:integer; mItem:DWORD; ...

  4. 基于ET框架致敬LOL的Moba游戏源码,包含完整的客户端与服务端交互

    运行环境 编辑器:Unity 2020.3.12 LTS 客户端:.Net Framework 4.7.2 IDE:JetBrain Rider 2020 服务端:.Net Core 3.1 已实现功 ...

  5. 【游戏客户端】如何高效地和服务端交互“领奖信息”

    [游戏客户端]如何高效地和服务端交互"领奖信息"       Hallo大家好~~我是Lampard猿奋,今天在做需求的时候学习到了一种如何高效地交互获奖信息的方法,在这里分享给大 ...

  6. 百度地图 Android SDK - 检索功能使用的简单演示样例

    百度地图 SDK 不仅为广大开发人员提供了炫酷的地图展示效果.丰富的覆盖物图层,更为广大开发人员提供了多种 LBS 检索的能力. 通过这些接口,开发人员能够轻松的訪问百度的 LBS 数据,丰富自己的移 ...

  7. JDBC连接MySQL数据库及演示样例

    JDBC是Sun公司制定的一个能够用Java语言连接数据库的技术. 一.JDBC基础知识         JDBC(Java Data Base Connectivity,java数据库连接)是一种用 ...

  8. 最简单的视音频播放演示样例5:OpenGL播放RGB/YUV

    ===================================================== 最简单的视音频播放演示样例系列文章列表: 最简单的视音频播放演示样例1:总述 最简单的视音频 ...

  9. SNF快速开发平台MVC-各种级联绑定方式,演示样例程序(包含表单和表格控件)...

    做了这么多项目,经常会使用到级联.联动的情况. 如:省.市.县.区.一级分类.二级分类.三级分类.仓库.货位. 方式:有表单需要做级联的,还是表格行上需要做级联操作的. 实现:实现方法也有很多种方式. ...

最新文章

  1. 54. spring boot日志升级篇—logback【从零开始学Spring Boot】
  2. mysql 自定义抛出异常_C#自定义异常(throw抛出异常)
  3. HashSet与HashMap源代码深度剖析
  4. 「Python」pycharm多项目虚拟环境切换
  5. 给超链接A添加按钮样式
  6. 用java swing做连连看_java基于swing实现的连连看代码
  7. 24-java版Spark程序读取ElasticSearch数据
  8. linux开机黑屏时间长,Linux 开机进入紧急模式,出现黑屏 grub 的参考解决方案
  9. 计算机网络—子网掩码的划分
  10. Qt4_Quit按键
  11. 《程序设计实践》读书笔记第五至六章
  12. Android开发中加载Gif动画图片方法
  13. 气象数据源-要素、数据集、空间分辨率、网址
  14. SQL建表语句转换为Excel表格
  15. Ubuntu一些名词解释
  16. Python 常用迭代函数总结
  17. Error response from daemon conflict unable to delete 3f37e5daf5bd (cannot be forced) - image is bein
  18. 中国防卫科技学院计算机,2014高考专业介绍:科技防卫
  19. 中邮消费金融面试随笔
  20. python实现俄罗斯方块小游戏

热门文章

  1. 中国电信线CTF线下选拨writeup
  2. window环境安装composer
  3. 廖雪峰js教程笔记9 json
  4. MANIFEST.MF文件全面解析
  5. MVC4.0网站发布和部署到IIS7.0上的方法
  6. [原创] 指针操作程序答案 — 谭浩强C语言习题答案
  7. 对list字段属性的部分修改的application
  8. ngrx心得体会总结
  9. Matlab 数字图像处理1---图像的收缩和放大
  10. Elasticsearch2.x Breaking changes