8.Android-简单的登录案例编写
本章来学习登录案例,由于还未学习自定义控件外观,所以ui界面先用最简单的,并保存登录账号密码到data/data/包名/files下
1.学习之前需要掌握的Context类(通过Context来往APK包所在目录下读写登录信息配置文件)
Context:可以理解为对APK的工具管家,通过Context可以访问当前应用相关的全局信息(系统资源)、 也可以发送广播、访问全局包信息、开启另外的activity、
1.1 如何获取Context
通过MainActivity.this获取
1.2 本章要用的Context常用的方法有:
FileOutputStream openFileOutput (String name, int mode);
//将数据存储到/data/data/<package name>/files/nam文件里, 注意这里指定的name文件名不可以包含路径
// mode:可以填入MODE_PRIVATE(文件只能由调用应用程序访问)、MODE_APPEND(追加内容模式)、MODE_WORLD_READABLE(文件支持所有人可读)、MODE_WORLD_WRITEABLE(文件支持所有人可写) FileInputStream openFileInput (String name)
//和openFileOutput()对应,该方法用于读取/data/data/<package name>/files/nam文件.
界面如下所示:

2.activity_main.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=".MainActivity" >
<EditText
android:id="@+id/et_user"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入账号"
/>
<EditText
android:id="@+id/et_password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textPassword"
android:hint="请输入密码"
android:layout_below="@id/et_user"
/>
<CheckBox
android:id="@+id/cb_save"
android:layout_below="@id/et_password"
android:layout_alignParentLeft="true"
android:layout_marginTop="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="保存密码"
/> <Button
android:id="@+id/bt_login"
android:layout_below="@id/et_password"
android:layout_alignParentRight="true"
android:layout_alignBaseline="@+id/cb_save"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="登录"
/> </RelativeLayout>
3.Utils.java如下(用来读写保存用户登录的文件)
package com.example.login.utils; import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader; import android.content.Context;
import android.util.Log; public class Utils { private boolean saveCheckd;
private String name;
private String pwd; public boolean isSaveCheckd() {
return saveCheckd;
} public void setSaveCheckd(boolean saveCheckd) {
this.saveCheckd = saveCheckd;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getPwd() {
return pwd;
} public void setPwd(String pwd) {
this.pwd = pwd;
} public static boolean saveInfo(Context context,Utils utils){ String info = String.valueOf(utils.saveCheckd)+"##"+utils.name+"##"+utils.pwd;
String pwdstr = utils.pwd==null?"true":"false"; FileOutputStream fileOutput;
try {
fileOutput = context.openFileOutput("info.txt", Context.MODE_PRIVATE); //打开要写的文件
fileOutput.write(info.getBytes());
fileOutput.close();
return true; }catch (IOException e) { e.printStackTrace();
return false;
}
} public static Utils getInfo(Context context){ try {
FileInputStream fis = context.openFileInput("info.txt"); //打开要读的文件
BufferedReader br = new BufferedReader(new InputStreamReader(fis));
String[] list =br.readLine().split("##"); Log.v("utils", "getInfo:"+String.valueOf(list.length));
Utils utils = new Utils(); utils.setSaveCheckd("true".equals(list[0]));
utils.setName(list[1]);
utils.setPwd(list[2]);
return utils;
} catch (IOException e) {
e.printStackTrace();
return null;
} } }
4.MainActivity.java如下所示:
package com.example.login; import com.example.login.utils.Utils;
import android.os.Bundle;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.text.TextUtils;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast; public class MainActivity extends Activity implements OnClickListener{
private Button bt_login;
private EditText et_user;
private EditText et_password;
private CheckBox cb_save; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); //获取控件
et_user = (EditText)findViewById(R.id.et_user);
et_password = (EditText)findViewById(R.id.et_password);
cb_save = (CheckBox)findViewById(R.id.cb_save);
bt_login = (Button)findViewById(R.id.bt_login); bt_login.setOnClickListener(this);
//判断之前的配置文件里是否保存有账号密码
Utils utils = Utils.getInfo(MainActivity.this);
if(utils!=null) //文件有内容?
{
et_user.setText(utils.getName());
if(utils.isSaveCheckd()) //保存了密码?
{
cb_save.setChecked(true);
et_password.setText(utils.getPwd());
}
}
} @Override
public void onClick(View v) { //1.判断账号密码是否为空
//2.判断是否需要保存账号密码
//3.登录完成
String user = et_user.getText().toString();
String pwd = et_password.getText().toString();
if(TextUtils.isEmpty(user)||TextUtils.isEmpty(pwd)){
//提示
Toast.makeText(MainActivity.this, "账号/密码为空", Toast.LENGTH_SHORT).show();
return;
}else{
Utils utils = new Utils();
utils.setSaveCheckd(cb_save.isChecked()); //更新checkbox标志
utils.setName(user); //更新登录账号 if(cb_save.isChecked()){
//保存密码
utils.setPwd(pwd);
Utils.saveInfo(MainActivity.this, utils);
}else{
Utils.saveInfo(MainActivity.this, utils);
}
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;
}
}
8.Android-简单的登录案例编写的更多相关文章
- Android first---文件读取(登录案例编写为主)
以android登录案例来介绍文件的读取与androidAPI给予的方法 第一步:绘制界面 绘制方法:在线性布局下面设置相对布局 代码部分: <LinearLayout xmlns:androi ...
- android
简单的登录
一直都知道WEB通过登录后session拿着回答,如今,安卓不知道怎么弄的. 研究了一下,它记录.直接在代码: server结束: index.jsp <%@page import=" ...
- Xamarin.Android再体验之简单的登录Demo
一.前言 在空闲之余,学学新东西 二.服务端的代码编写与部署 这里采取的方式是MVC+EF返回Json数据,(本来是想用Nancy来实现的,想想电脑太卡就不开多个虚拟机了,用用IIS部署也好) 主要是 ...
- 简单登录案例(SharedPreferences存储账户信息)&联网请求图片并下载到SD卡(文件外部存储)
新人刚学习Android两周,写一个随笔算是对两周学习成果的巩固,不足之处欢迎各位建议和完善. 这次写的是一个简单登录案例,大概功能如下: 注册的账户信息用SharedPreferences存储: 登 ...
- Android(java)学习笔记213:开源框架post和get方式提交数据(qq登录案例)
1.前面提到Http的get/post方式 . HttpClient方式,实际工作的时候不常用到,因为这些方式编写代码是很麻烦的 2.Android应用会经常使用http协议进行传输,网上会有很完善 ...
- Android(java)学习笔记212:中文乱码的问题处理(qq登录案例)
1.我们在之前的笔记中LoginServlet.java中,我们Tomcat服务器回复给客户端的数据是英文的"Login Success","Login Failed&q ...
- Android(java)学习笔记156:开源框架post和get方式提交数据(qq登录案例)
1. 前面提到Http的get/post方式 . HttpClient方式,实际工作的时候不常用到,因为这些方式编写代码是很麻烦的 2. Android应用会经常使用http协议进行传输,网上会有很 ...
- Android(java)学习笔记155:中文乱码的问题处理(qq登录案例)
1. 我们在之前的笔记中LoginServlet.java中,我们Tomcat服务器回复给客户端的数据是英文的"Login Success","Login Failed& ...
- Android破解学习之路(一)——简单的登录破解
最近突然心血如潮开始学了Android破解,初入门,便是将经验记录下来. 准备工作: 1.一个登录简单APP 在我们破解之前,我们需要做一个简单的登录APP,输入相应的账号与密码便是弹出登录成功的对话 ...
随机推荐
- 16_Python的包package
1.包的概述 1.包是将模块一文件夹的组织形式进行分组管理的方法,一系列模块进行分类管理有利于防止命名冲突 2.包是一个包含多个模块的特色目录,目录下有一个特色的文件__init__.py 3.包的命 ...
- Codeforces Round #669 (Div. 2)A-C题解
A. Ahahahahahahahaha 题目:http://codeforces.com/contest/1407/problem/A 题解:最多进行n/2的操作次数,我们统计这n个数中1的个数,是 ...
- Apache Nginx Tomcat
Tomcat Tomcat:动态解析容器 处理动态请求,是编译JSP/Servlet的容器 区别: 严格意义上来说 Apache和nginx应该叫做HTTP Server tomcat是一个Appli ...
- 2.1 Spring5源码编译
一. 准备工作 1. . 编译环境 maven jdk8 idea 2. 编译版本: SpringV5.2.7RELEASE+GradleWapper+jdk1.8.0_131编译 二. 源码下载 g ...
- kvm虚拟化存储管理(3)
一.KVM 存储虚拟化介绍 KVM 的存储虚拟化是通过存储池(Storage Pool)和卷(Volume)来管理的. Storage Pool 是宿主机上可以看到的一片存储空间,可以是多种型: Vo ...
- CTF-BugKu-WEB-1-20
2020.09.17 全面复习web,给自己定个目标,后天之前结束BugKu-Web,开始逆向. 经验教训 php弱等于用于绕过==,弱等于之前会把等号两边转化为同一类型变量: 全局变量全局变量全局变 ...
- python文档翻译之python说明
3.1使用Python进行计数 让我们来使用一些Python的简单命令,通过终端启动解释器等待出现>>>. 3.1.1数值类型 在终端中输入数学表达式,Python解释器会执行这些表 ...
- Combine 框架,从0到1 —— 4.在 Combine 中执行异步代码
本文首发于 Ficow Shen's Blog,原文地址: Combine 框架,从0到1 -- 4.在 Combine 中执行异步代码. 内容概览 前言 用 Future 取代回调闭包 用输出类型( ...
- Jmeter(二十三) - 从入门到精通 - JMeter函数 - 上篇(详解教程)
1.简介 在性能测试中为了真实模拟用户请求,往往我们需要让提交的表单内容每次都发生变化,这个过程叫做参数化.JMeter配置元件与前置处理器都能帮助我们进行参数化,但是都有局限性,为了帮助我们能够更好 ...
- linux 上部署 YApi 可视化接口管理平台
linux 上部署 YApi 可视化接口管理平台: YApi 是一个高效.易用.功能强大的可视化接口管理平台,官方地址 : http://yapi.demo.qunar.com/ 环境要求 nodej ...