简单登录注册页面(初学者),可以和后台交互
客户端:
客户端实现了简单的登录、注册功能、还可保存输入的用户名和密码。使用的POST请求实现和后台服务端的交互。不多说,上代码:
客户端布局文件(activity_main.xml):

<EditText
    android:id="@+id/id"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="78dp"
    android:ems="10"
    android:inputType="textPersonName"
    android:hint="用户名" />

<EditText
    android:id="@+id/password"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"    
    android:layout_alignRight="@+id/id"
    android:layout_below="@+id/id"
    android:layout_marginTop="28dp"
    android:ems="10"
    android:inputType="textPassword"
    android:hint="密码"/>

<CheckBox 
    android:id="@+id/check"
    android:text="记住用户名和密码"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/password"
    android:layout_alignLeft="@+id/password"/>

<Button
    android:id="@+id/register"
    android:text="注册"
    android:layout_marginTop="40dp"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/password"
    android:layout_alignLeft="@+id/password"/>

<Button
    android:id="@+id/login"
    android:text="登录"
    android:layout_marginTop="40dp"
    android:layout_below="@id/password"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignRight="@id/password"/>

MainActivity.java:

public class MainActivity extends Activity implements OnClickListener{
	private EditText id;
	private EditText password;
	private Button login;
	private Button register;
	private CheckBox cb;
	private String username;
	private String pwd;
	private SharedPreferences sp;
	private String result;
	private int RequestCode = 1;
	protected void onCreate(Bundle savedInstanceState){
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		id = (EditText) findViewById(R.id.id);
		password = (EditText) findViewById(R.id.password);
		login = (Button) findViewById(R.id.login);
		//register.setOnClickListener(this);
		login.setOnClickListener(this);
		register = (Button) findViewById(R.id.register);	
		register.setOnClickListener(this);
		cb = (CheckBox) findViewById(R.id.check);
		sp = getSharedPreferences("config", 0);
		//将数据显示到UI控件
		//把config.xml文件中的数据取出来显示到EditText控件中
		//如果没找到key键对应的值,会返回第二个默认的值
		String username = sp.getString("username", "");
		String password = sp.getString("password", "");
		id.setText(username);
		this.password.setText(password);
	}
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);
		if(requestCode==1&&resultCode==2){
			id.setText(data.getStringExtra("id"));
			password.setText(data.getStringExtra("password"));
		}
	}
	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.login:
		username = id.getText().toString().trim();
			pwd = password.getText().toString().trim();
			if(cb.isChecked()){//判断是否勾选
//			//使用sharePreferences区保存数据 拿到sp实例
//			//参数:  name生成xml文件
//			//mode 模式
//			
//			//获取sp的编辑器
			Editor editor=sp.edit();
//			//存储用户输入的数据
     		editor.putString("username", username);
			editor.putString("password", pwd);
//			//提交editor
			editor.commit();
		}
		if(TextUtils.isEmpty(username)||TextUtils.isEmpty(pwd)){
				Toast.makeText(getApplicationContext(), "账号或密码不能为空", 1).show();
			}else{
				new Thread(){
				public void run(){
						try {
							//设置路径
							//设置路径
							String path="http://192.168.227.1:8080/MyWebsite/androidlogin.do?id="+username+"&password="+pwd+"";
							//创建URL对象
							URL url=new URL(path);
							//创建一个HttpURLConnection对象
							HttpURLConnection conn=(HttpURLConnection) url.openConnection();
							//设置请求方法
							conn.setRequestMethod("POST");
							//设置请求超时时间
							conn.setReadTimeout(5000);
							conn.setConnectTimeout(5000);
							
							//Post方式不能设置缓存,需要手动设置
							conn.setUseCaches(false);
							//设置我们的请求数据
							String data="id="+username+"&password="+pwd;
							conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");//使用的是表单请求类型
		                    conn.setRequestProperty("Content-Length", data.length()+"");
		                    conn.setDoOutput(true);
		                    conn.getOutputStream().write(data.getBytes());
//		                    //连接
//		                    conn.connect();
//							//获取一个输出流
//							OutputStream out=conn.getOutputStream();
//							out.write(data.getBytes());
							//获取服务器返回的状态吗
							int code=conn.getResponseCode();
							if(code==200){
								//获取服务器返回的输入流对象
								InputStream in= conn.getInputStream();
								result = StringTools.readStream(in);
								//更新UI
								runOnUiThread(new Runnable() {
								@Override
									public void run() {
										if(result.equals("success"))
										// TODO Auto-generated method stub
										Toast.makeText(getApplicationContext(), "登录成功", 1).show();
										else{
											Toast.makeText(getApplicationContext(), "登录失败", 1).show();
											}
									}
								});
							}
						} catch (Exception e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
					}
						
					};
				}.start();
			}
			break;
          case R.id.register:
        	  //跳转到登录页面
        	  Intent intent=new Intent(this,RegisterActivity.class);
        	  startActivityForResult(intent,RequestCode);
        	  break;
		default:
			break;
		}		
	}	
}

注册页面布局文件(register.xml):

<EditText
    android:id="@+id/id_edit"
    android:hint="用户名"
    android:layout_marginTop="50dp"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" /> 
<EditText
    android:id="@+id/password_edit"
    android:hint="密码"
    android:layout_marginTop="10dp"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" /> 

<EditText
    android:id="@+id/password_edit_1"
    android:hint="确认密码"
    android:layout_marginTop="10dp"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />
<EditText
    android:id="@+id/email_edit"
    android:hint="邮箱"
    android:layout_below="@+id/password_edit_1"
    android:layout_marginTop="10dp"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

    <Button
        android:id="@+id/register_do"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="click1"
        android:text="注册" />

注册页面逻辑(RegisterActivity.java):
public class RegisterActivity extends Activity implements OnClickListener{
private Button register;
private EditText id;
private EditText pwd_1;
private EditText pwd_2;
private EditText email;
private String result;
private String username;
private String pwd1;
private String e_mail;
private String pwd2;
private int ResultCode=2;

protected void onCreate(Bundle savedInstanceState){
	super.onCreate(savedInstanceState);
	setContentView(R.layout.register);	
	register = (Button) findViewById(R.id.register_do);
	register.setOnClickListener(this);
	id = (EditText) findViewById(R.id.id_edit);
	pwd_1 = (EditText) findViewById(R.id.password_edit);
	pwd_2 = (EditText) findViewById(R.id.password_edit_1);
	email = (EditText) findViewById(R.id.email_edit);
}

@Override
public void onClick(final View v) {
	new Thread(){public void run() {

		switch (v.getId()) {
		case R.id.register_do:
			username = id.getText().toString().trim();
			e_mail = email.getText().toString().trim();
			pwd1 = pwd_1.getText().toString().trim();
			pwd2 = pwd_2.getText().toString().trim();
			if(!pwd1.equals(pwd2)){
				runOnUiThread(new Runnable() {
					
					@Override
					public void run() {
						Toast.makeText(getApplicationContext(), "两次输入密码不一致,请重新输入!", 1).show();
					}
				});
			}else {
				try {
					//设置路径
					String path="http://192.168.227.1:8080/MyWebsite/androidregister.do?id="+username+"&password="+ pwd1+"&email="+e_mail+"";
					//创建URL对象
					URL url=new URL(path);
					//创建一个HttpURLconnection对象
					HttpURLConnection conn =(HttpURLConnection) url.openConnection();
					//设置请求方法
					conn.setRequestMethod("POST");
					//设置请求超时时间
					conn.setReadTimeout(5000);
					//conn.setConnectTimeout(5000);
					//Post方式不能设置缓存,需要手动设置
					//conn.setUseCaches(false);
					//准备要发送的数据
					String data ="id="+URLEncoder.encode(username,"utf-8")+"&password"+URLEncoder.encode(pwd1,"utf-8")+"&email"+URLEncoder.encode(e_mail,"utf-8");
					conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");//使用的是表单请求类型
                    conn.setRequestProperty("Content-Length", data.length()+"");
                    conn.setDoOutput(true);
                    //连接
                   // conn.connect();
					//获得返回的状态码
                    conn.getOutputStream().write(data.getBytes());
					int code=conn.getResponseCode();
					if(code==200){
						//获得一个文件的输入流
						InputStream inputStream= conn.getInputStream();
						result = StringTools.readStream(inputStream);
						//更新UI
						showToast(result);
					}
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			break;
		default:
			break;
		}		
	};}.start();
}
public void showToast(final String content){
	runOnUiThread(new Runnable() {		
		@Override
		public void run() {
			// TODO Auto-generated method stub
			if(result.equals("success")){
				Toast.makeText(getApplicationContext(), "注册成功", 1).show();
				Intent intent=new Intent();	
				intent.putExtra("id", username);
				intent.putExtra("password", pwd1);
				setResult(ResultCode, intent);
				finish();
			}		
		}
	});
}     
 }

工具类:将客户端发送的流数据转化为字符串(StringTools):

public static String readStream(InputStream in)throws Exception{
	//将传进来的流信息转换为字符串
	 //创建1字节输出流对象
	 ByteArrayOutputStream outputStream=new ByteArrayOutputStream();
	 //定义读取长度
	 int len=0;
	 //定义缓存区
	 byte buffer[]=new byte[2014];
	 //按照缓存区大小循环读取
	 while((len=in.read(buffer))!=-1){
		 outputStream.write(buffer, 0, len);
	 }
	 in.close();
	 outputStream.close();
	 //将字符串数据返回
	 String content=new String(outputStream.toByteArray());
	 return content;	 
 }
 }

以上是客户端的所有内容,包含所有的页面和对应的逻辑。
服务端的内容:不具体贴出所有的代码,给予简单的介绍:
开发工具:Eclipse2018
数据库:MySQL数据库(数据库的创建,请跟具代码具体创建)
具体服务端代码:点击以下链接下载
服务端代码提取密码:lncl