在我们平时使用的手机应用都能够实现仅仅须要登陆一次账号后,第二次进入应用直接跳转到效果界面的效果,还有QQ的登陆框是怎样记忆我们的隐身登陆,保存账号选项的呢,这些都是通过使用SharedPreferences共享參数效果实现的,而无须使用数据库来存储。下面我们直接看具体代码分析。

package com.example.account.login;

import java.util.HashMap;
import java.util.Map; import com.android.dao.MySQLiteOpenHelper;
import com.example.account.MainActivity;
import com.example.account.R; import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast; public class LoginActivity extends Activity {
private EditText e1, e2;
private SQLiteOpenHelper helper;
private boolean flag, flag2, flag3;
private HashMap<String, Object> map; @SuppressWarnings("unchecked")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login);
TextView textView = (TextView) this.findViewById(R.id.textView1);
e1 = (EditText) this.findViewById(R.id.editText1);
e2 = (EditText) this.findViewById(R.id.editText2);
//从共享參数获取数据
map = (HashMap<String, Object>) getMsg("login");
if (map != null && !map.isEmpty()) {
if ((Boolean) map.get("login2")) {
//若值为true,用户无需输入password,直接跳转进入操作界面
Intent intent = new Intent(LoginActivity.this,
MainActivity.class);
startActivity(intent);
}
}
helper = new MySQLiteOpenHelper(this);
textView.setText("登录界面");
Button button = (Button) findViewById(R.id.button2);
button.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
if (!e1.getText().toString().isEmpty()
&& !e2.getText().toString().isEmpty()) {
//从数据库获取账号信息
SQLiteDatabase database = helper.getReadableDatabase();
Cursor cursor = database.query("user", new String[] {
"username", "password" }, null, null, null, null,
null);
while (cursor.moveToNext()) {
flag = e1
.getText()
.toString()
.equals(cursor.getString(cursor
.getColumnIndex("username")));
flag2 = e2
.getText()
.toString()
.equals(cursor.getString(cursor
.getColumnIndex("password")));
if (flag && flag2) {
Intent intent = new Intent(LoginActivity.this,
MainActivity.class);
startActivity(intent);
//登陆跳转动画
overridePendingTransition(R.anim.zoomin,
R.anim.zoomout);
Toast.makeText(LoginActivity.this, "登录成功",
Toast.LENGTH_SHORT).show();
flag3 = true;
//登陆成功后将flag设置为ture存入共享參数中
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("login2", flag3);
saveMsg("login", map);
}
}
if (!flag3) {
Toast.makeText(LoginActivity.this, "您输入的帐号或password有误",
Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(LoginActivity.this, "请正确输入您的帐号password",
Toast.LENGTH_SHORT).show();
} } });
Button button2 = (Button) findViewById(R.id.button1);
button2.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) { Intent intent = new Intent(LoginActivity.this,
RegisterActivity.class);
startActivity(intent); } }); }
//将数据存储进入共享參数
public boolean saveMsg(String fileName, Map<String, Object> map) {
boolean flag = false;
// 一般Mode都使用private,比較安全
SharedPreferences preferences = getSharedPreferences(fileName,
Context.MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
// Map类提供了一个称为entrySet()的方法,这种方法返回一个Map.Entry实例化后的对象集。
// 接着,Map.Entry类提供了一个getKey()方法和一个getValue()方法,
// 因此,上面的代码能够被组织得更符合逻辑
for (Map.Entry<String, Object> entry : map.entrySet()) {
String key = entry.getKey();
Object object = entry.getValue();
// 依据值得不同类型,加入
if (object instanceof Boolean) {
Boolean new_name = (Boolean) object;
editor.putBoolean(key, new_name);
} else if (object instanceof Integer) {
Integer integer = (Integer) object;
editor.putInt(key, integer);
} else if (object instanceof Float) {
Float f = (Float) object;
editor.putFloat(key, f);
} else if (object instanceof Long) {
Long l = (Long) object;
editor.putLong(key, l);
} else if (object instanceof String) {
String s = (String) object;
editor.putString(key, s);
}
}
flag = editor.commit();
return flag; } // 读取数据
public Map<String, ?> getMsg(String fileName) {
Map<String, ?> map = null;
// 读取数据用不到edit
SharedPreferences preferences = getSharedPreferences(fileName,
Context.MODE_APPEND);
//Context.MODE_APPEND能够对已存在的值进行改动
map = preferences.getAll();
return map;
} }

Android开发之自己主动登录功能的实现的更多相关文章

  1. android使用smack实现简单登录功能

    android端采用xmpp协议实现即时通讯,在最开始的登录功能就遇到了不少障碍.首先在官网(https://www.igniterealtime.org/projects/openfire/)下载o ...

  2. Android开发实例之miniTwitter登录界面的实现

    原文: http://www.jizhuomi.com/android/example/134.html 本文要演示的Android开发实例是如何完成一个Android中的miniTwitter登录界 ...

  3. android开发学习——facebook第三方登录,看了你不会后悔

    给APP用原生android进行facebook第三方登录. 我们做一件事情,首先得了解其原理,这样才不会迷茫,才知道自己做到什么程度了,心里才会有底. 所以,第一步,了解第三方登录的原理:下面贴一些 ...

  4. Android 开发自己的网络收音机1——功能要求及设计方案

    最近打算利用业余时间,编写一个Android的网络收音机.因为我自己偶尔也喜欢听听广播,所以打算用业余时间编写一个网络版收音机.说起收音机,其实在工作中已经编写过一个,不过那个收音机是需要硬件支持,也 ...

  5. Android开发实现QQ三方登录 标签: android开发qq三方登录

    本文分为两个部分:一是QQ的授权部分:二是获取用户的基本信息部分 一.授权部分 1.首先,先去腾讯开放平台获取APP ID和APP KEY(未注册腾讯开发者账号的可能需要先注册账号),获取的过程还是还 ...

  6. Android Studio—增删改查—登录功能

    SQLite数据库的常用操作: create table if not exists 表名(字段1 类型(长度),字段2 类型(长度),...)//       建表 drop table if ex ...

  7. Android 开发 框架系列 OkHttp文件下载功能实现(含断点续传)

    前言 此篇博客只是下载功能的记录demo,如果你还不太了解okhttp可以参考我的另一篇博客https://www.cnblogs.com/guanxinjing/p/9708575.html 代码部 ...

  8. Android 开发 Camera1_如何使用对焦功能

    前言 Camera1的自动对焦还是有一些坑值得开一个篇幅来讲解,一般对焦Mode有以下几种: Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO 连续自动对焦视 ...

  9. Android开发-记账本-实现记账功能选择

    制作GridView适配器,实现页面数据的变化 制作类型存储数据库,存储的主要是图片类型,类型被选中时的图片,类型未被选中时的图片. 数据库代码如下 package com.example.Utils ...

随机推荐

  1. Java面试题集(136-150)

    摘要:目,尽管仅仅有15道题目.可是包括的信息量还是非常大的,非常多题目背后的解题思路和算法是非常值得玩味的. 136.给出以下的二叉树先序.中序.后序遍历的序列? 答:先序序列:ABDEGHCF.中 ...

  2. nodeValue的兼容问题

    nodeValue获取Text或Comment元素的文本值. 在IE6.IE7.IE8中游览器会自作聪明的去掉前面的空白字符text,而其它现代游览器则会保留空白 <body> <s ...

  3. Android从无知到有知——NO.7

    的ip拨号器在监听外拨电话时用的是系统提供的广播事件.而有些时候我们须要自己设定广播事件来满足特定的须要. Ok,今天整一下自己定义广播事件,我们用一个状态监測模块向一个3G模块发送报警信息来实现这一 ...

  4. repo总结

    repo刚google使用Python脚本写通话git脚本.主要用于下载.管理Android工程仓库. 1. 下载 repo 的地址: http://android.git.kernel.org/re ...

  5. gradle(转)

    一.声明dependency     在build.gradle文件编辑以下代码: apply plugin: 'java' repositories { mavenCentral() } depen ...

  6. Net Memory Profiler 分析.Net程序内存泄露

    Net Memory Profiler 分析.Net程序内存泄露 Haozes's Tech Space 人類的全部才能無非是時間和耐心的混合物 使用.Net Memory Profiler 分析.N ...

  7. python网络爬虫学习笔记

    python网络爬虫学习笔记 By 钟桓 9月 4 2014 更新日期:9月 4 2014 文章文件夹 1. 介绍: 2. 从简单语句中開始: 3. 传送数据给server 4. HTTP头-描写叙述 ...

  8. U菜1G变化8M该解决方案

    我有一个大小1G纽曼U菜,不幸中毒一年前,格式化后你刚刚离开8M该.然后不再格式正确. 尽管只有8M,但始终我觉得扔了可惜.曾经,它已被搁置.昨天突然心血来潮,我们决定尝试.活马医.想不到最后居然被我 ...

  9. DICOM医学图像处理:开源库mDCM与DCMTK的比較分析(一),JPEG无损压缩DCM图像

    背景介绍: 近期项目需求,须要使用C#进行最新的UI和相关DICOM3.0医学图像模块的开发.在C++语言下,我使用的是应用最广泛的DCMTK开源库,在本专栏的起初阶段的大多数博文都是对DCMTK开源 ...

  10. JAVA字符串比较equals()和equalsIgnoreCase()差异

    .用equals( )方法比較两个字符串是否相等.它具有例如以下的一般形式: boolean equals(Object str) 这里str是一个用来与调用字符串(String)对象做比較的字符串( ...