基于IntentService的Android登录完整示例

2024-01-18 17:18

本文主要是介绍基于IntentService的Android登录完整示例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

/**
* Copyright(C) 2014
*
* 模块名称:     
* 子模块名称:   
*
* 备注:
*
* 修改历史:
* 2014-1-26	1.0		liwei5946@gmail.com		新建
*/
package cn.edu.hbcit.minicms.controller;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 org.apache.log4j.Logger;import cn.edu.hbcit.minicms.dao.Login;
import cn.edu.hbcit.minicms.util.PasswordEncodeBean;/*** 登录控制类* 简要说明:* @author liwei5946@gmail.com* @version 1.00  2014-1-26下午07:21:13	新建*/public class LoginServlet extends HttpServlet {protected final static Logger log = Logger.getLogger(LoginServlet.class.getName());/*** Constructor of the object.*/public LoginServlet() {super();}/*** Destruction of the servlet. <br>*/public void destroy() {super.destroy(); // Just puts "destroy" string in log// Put your code here}/*** The doGet method of the servlet. <br>*/public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {this.doPost(request, response);}/*** The doPost method of the servlet. <br>** This method is called when a form has its tag value method equals to post.* * @param request the request send by the client to the server* @param response the response send by the server to the client* @throws ServletException if an error occurred* @throws IOException if an error occurred*/public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html");PrintWriter out = response.getWriter();Boolean flag = false;Login login = new Login();PasswordEncodeBean encode = new PasswordEncodeBean();String userName = request.getParameter("un");String password = request.getParameter("pw");flag = login.login(userName, encode.MD5Encode(password));log.debug("登录结果是:" + flag);out.print(flag);out.flush();out.close();}/*** Initialization of the servlet. <br>** @throws ServletException if an error occurs*/public void init() throws ServletException {// Put your code here}}

2.在ADT中新建一个android工程,建立两个Activity,分别作为登录界面和登录成功界面。

activity_main.xml

<LinearLayout 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:orientation="vertical"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/mainContent"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="TextView" /><EditTextandroid:id="@+id/userName"android:layout_width="match_parent"android:layout_height="wrap_content"android:ems="10" android:inputType="text" />"<EditTextandroid:id="@+id/password"android:layout_width="match_parent"android:layout_height="wrap_content"android:ems="10"android:inputType="textPassword" /><Buttonandroid:id="@+id/myButton"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Submit" /></LinearLayout>
activity_result.xml

<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=".ResultActivity" ><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/hello_world" /></RelativeLayout>

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

package edu.hbcit.testandroid.util;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.util.Log;public class HttpUtil
{// 创建HttpClient对象public static HttpClient httpClient = new DefaultHttpClient();public static final String BASE_URL = "http://192.168.1.101:8080/server/"; //注意不要用127.0.0.1/*** * @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<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, "gbk"));// 发送POST请求HttpResponse httpResponse = httpClient.execute(post);// 如果服务器成功地返回响应if (httpResponse.getStatusLine().getStatusCode() == 200){// 获取服务器响应字符串String result = EntityUtils.toString(httpResponse.getEntity());return result;}return null;}
}

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

package edu.hbcit.testandroid.service;import java.util.HashMap;import edu.hbcit.testandroid.util.HttpUtil;
import android.app.IntentService;
import android.content.Intent;
import android.util.Log;public class ConnectService extends IntentService {private static final String ACTION_RECV_MSG = "edu.hbcit.testandroid.intent.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获取主线程传来的用户名和密码字符串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 + "LoginServlet?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 blocke.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="edu.hbcit.testandroid"android:versionCode="1"android:versionName="1.0" ><uses-sdkandroid:minSdkVersion="9"android:targetSdkVersion="14" /><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="edu.hbcit.testandroid.activity.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="edu.hbcit.testandroid.activity.ResultActivity"android:label="@string/title_activity_result" ></activity><service android:name="edu.hbcit.testandroid.service.ConnectService"></service></application></manifest>

6.重头戏Activity登场——需要注意的几个要点

  1. 按钮监听事件中,使用Intent将要传递的值传给service。有点类似于Java Web中的session。
  2. 接收广播类中,同样使用Intent将要传递的值传给下一个Activity。
  3. 在onCreate()中,动态注册接收广播类的实例receiver。
  4. 在接收广播类中,不要使用完毕后忘记注销接收器,否则会报一个Are you missing a call to unregisterReceiver()? 的异常。

package edu.hbcit.testandroid.activity;import java.util.HashMap;import edu.hbcit.testandroid.R;
import edu.hbcit.testandroid.R.id;
import edu.hbcit.testandroid.R.layout;
import edu.hbcit.testandroid.R.menu;
import edu.hbcit.testandroid.service.ConnectService;
import edu.hbcit.testandroid.util.DialogUtil;
import edu.hbcit.testandroid.util.HttpUtil;
import android.os.Bundle;
import android.os.StrictMode;
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.TextView;public class MainActivity extends Activity {private static final String ACTION_RECV_MSG = "edu.hbcit.testandroid.intent.action.RECEIVE_MESSAGE";private MessageReceiver receiver ;EditText et_username ;EditText et_password;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//获取文本viewTextView tv = (TextView)findViewById(R.id.mainContent);//获取输入框et_username = (EditText)findViewById(R.id.userName);et_password = (EditText)findViewById(R.id.password);//获取按钮Button submit = (Button)findViewById(R.id.myButton);tv.setText("这是Hello World登录示例");//http://192.168.1.101:8080/server/LoginServlet?un=aaa&pw=123456//为按钮绑定事件监听器submit.setOnClickListener(new OnClickListener(){public void onClick(View v){if (validate()){// 如果登录成功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);}}});//动态注册receiver  IntentFilter filter = new IntentFilter(ACTION_RECV_MSG);  filter.addCategory(Intent.CATEGORY_DEFAULT);  receiver = new MessageReceiver();  registerReceiver(receiver, filter);  }// 对用户输入的用户名、密码进行校验private boolean validate(){String username = et_username.getText().toString().trim();if (username.equals("")){DialogUtil.showDialog(this, "用户名是必填项!", false);return false;}String pwd = et_password.getText().toString().trim();if (pwd.equals("")){DialogUtil.showDialog(this, "密码是必填项!", false);return false;}return true;}//接收广播类  public class MessageReceiver extends BroadcastReceiver {  @Override  public void onReceive(Context context, Intent intent) {  String message = intent.getStringExtra("result");  Log.d("MessageReceiver", message);// 如果登录成功if (message.equals("true")){// 启动Main ActivityIntent nextIntent = new Intent(MainActivity.this, ResultActivity.class);startActivity(nextIntent);// 结束该Activityfinish();//注销广播接收器context.unregisterReceiver(this);}else{DialogUtil.showDialog(MainActivity.this, "用户名称或者密码错误,请重新输入!", false);}}  }  }

运行效果:

1.登录界面

2.登录失败界面

3.登录成功界面


小李专栏原创文章,转自需注明出处【http://blog.csdn.net/softwave】。

这篇关于基于IntentService的Android登录完整示例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/619705

相关文章

Security OAuth2 单点登录流程

单点登录(英语:Single sign-on,缩写为 SSO),又译为单一签入,一种对于许多相互关连,但是又是各自独立的软件系统,提供访问控制的属性。当拥有这项属性时,当用户登录时,就可以获取所有系统的访问权限,不用对每个单一系统都逐一登录。这项功能通常是以轻型目录访问协议(LDAP)来实现,在服务器上会将用户信息存储到LDAP数据库中。相同的,单一注销(single sign-off)就是指

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

【测试】输入正确用户名和密码,点击登录没有响应的可能性原因

目录 一、前端问题 1. 界面交互问题 2. 输入数据校验问题 二、网络问题 1. 网络连接中断 2. 代理设置问题 三、后端问题 1. 服务器故障 2. 数据库问题 3. 权限问题: 四、其他问题 1. 缓存问题 2. 第三方服务问题 3. 配置问题 一、前端问题 1. 界面交互问题 登录按钮的点击事件未正确绑定,导致点击后无法触发登录操作。 页面可能存在

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

Android 10.0 mtk平板camera2横屏预览旋转90度横屏拍照图片旋转90度功能实现

1.前言 在10.0的系统rom定制化开发中,在进行一些平板等默认横屏的设备开发的过程中,需要在进入camera2的 时候,默认预览图像也是需要横屏显示的,在上一篇已经实现了横屏预览功能,然后发现横屏预览后,拍照保存的图片 依然是竖屏的,所以说同样需要将图片也保存为横屏图标了,所以就需要看下mtk的camera2的相关横屏保存图片功能, 如何实现实现横屏保存图片功能 如图所示: 2.mtk

android应用中res目录说明

Android应用的res目录是一个特殊的项目,该项目里存放了Android应用所用的全部资源,包括图片、字符串、颜色、尺寸、样式等,类似于web开发中的public目录,js、css、image、style。。。。 Android按照约定,将不同的资源放在不同的文件夹中,这样可以方便的让AAPT(即Android Asset Packaging Tool , 在SDK的build-tools目

Android fill_parent、match_parent、wrap_content三者的作用及区别

这三个属性都是用来适应视图的水平或者垂直大小,以视图的内容或尺寸为基础的布局,比精确的指定视图的范围更加方便。 1、fill_parent 设置一个视图的布局为fill_parent将强制性的使视图扩展至它父元素的大小 2、match_parent 和fill_parent一样,从字面上的意思match_parent更贴切一些,于是从2.2开始,两个属性都可以使用,但2.3版本以后的建议使