php换设备登录逻辑,登录和退出登录的操作逻辑

登录功能的操作逻辑步骤如下:可以分为五个步骤来实现。

1、进入页面先判断用户是否已经登录

private void isLogin() {

//查看本地是否有用户的登录信息

SharedPreferences sp = this.getActivity().getSharedPreferences("user_info", Context.MODE_PRIVATE);

String name = sp.getString("name", "");

if (TextUtils.isEmpty(name)) {

//本地没有保存过用户信息,给出提示:登录

doLogin();

} else {

//已经登录过,直接加载用户的信息并显示

doUser();

}

}

2、没有登录过,则提示用户登录,点击后跳转到登录页面

//提示用户登录

private void doLogin() {

new AlertDialog.Builder(this.getActivity())

.setTitle("提示")

.setMessage("您还没有登录哦!么么~")

.setPositiveButton("确定", new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialogInterface, int i) {

// UIUtils.toast("进入登录界面",false);

((BaseActivity) MeFragment.this.getActivity()).goToActivity(LoginActivity.class, null);

}

})

.setCancelable(false)

.show();

}

3、在登录页面中做登录操作,登录成功后保存相应的用户信息到本地

//保存用户信息

public void saveUser(User user){

SharedPreferences sp = this.getSharedPreferences("user_info", Context.MODE_PRIVATE);

SharedPreferences.Editor editor = sp.edit();

editor.putString("name",user.getName());

editor.putString("imageurl",user.getImageurl());

editor.putBoolean("iscredit",user.isCredit());

editor.putString("phone",user.getPhone());

editor.commit();//必须提交,否则保存不成功

}

4、用户已经登录过了,则加载并显示相应的信息

//加载用户信息并显示

private void doUser() {

//1.读取本地保存的用户信息

User user = ((BaseActivity) this.getActivity()).readUser();

//2.获取对象信息,并设置给相应的视图显示

tvMeName.setText(user.getName());

//判断本地是否已经保存头像的图片,如果有,则不执行联网操作

boolean isExist = readImage();

if (isExist){

return;

}

//使用Picasso联网获取图片

Picasso.with(this.getActivity()).load(user.getImageurl()).transform(new Transformation() {

@Override

public Bitmap transform(Bitmap source) {//下载以后的内存中的bitmap对象

//压缩处理

Bitmap bitmap = BitmapUtils.zoom(source, UIUtils.dp2px(62), UIUtils.dp2px(62));

//图形处理

bitmap = BitmapUtils.circleBitmap(bitmap);

//回收bitmap对象

source.recycle();

return bitmap;

}

@Override

public String key() {

return "";

}

}).into(ivMeIcon);

}

5、退出登录,需要清除本地保存的用户信息

public void logout(View view){//"退出登录"button的回调方法

//1、将保存在sp中的数据删除

SharedPreferences sp = this.getSharedPreferences("user_info", Context.MODE_PRIVATE);

sp.edit().clear().commit();//清除数据必须要提交:提交以后,文件仍存在,只是文件中的数据被清除了

//2、将本地保存的图片的file删除

File filesDir;

if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {//判断sd卡是否挂载

//路径1:storage/sdcard/Android/data/包名/files

filesDir = this.getExternalFilesDir("");

} else {//手机内部存储

//路径:data/data/包名/files

filesDir = this.getFilesDir();

}

File file = new File(filesDir, "icon.png");

if (file.exists()){

file.delete();//删除存储中的文件

}

//3、销毁所有的Activity

this.removeAll();

//4、重新进入首页面

goToActivity(MainActivity.class,null);

}

登录返回的信息实体类User.class

public class User {

private int id;// 编号

private String name;// 姓名

private String password;// 密码

private String phone;// 手机号

private String imageurl;// 头像地址

private boolean iscredit;// 是否公安部认证

public User() {

super();

}

public User(int id, String name, String password, String phone) {

super();

this.id = id;

this.name = name;

this.password = password;

this.phone = phone;

}

public User(int id, String name, String password, String phone,

String imageurl) {

super();

this.id = id;

this.name = name;

this.password = password;

this.phone = phone;

this.imageurl = imageurl;

}

public User(int id, String name, String password, String phone,

String imageurl, boolean iscredit) {

super();

this.id = id;

this.name = name;

this.password = password;

this.phone = phone;

this.imageurl = imageurl;

this.iscredit = iscredit;

}

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getPassword() {

return password;

}

public void setPassword(String password) {

this.password = password;

}

public String getPhone() {

return phone;

}

public void setPhone(String phone) {

this.phone = phone;

}

public String getImageurl() {

return imageurl;

}

public void setImageurl(String imageurl) {

this.imageurl = imageurl;

}

public boolean isCredit() {

return iscredit;

}

public void setCredit(boolean iscredit) {

this.iscredit = iscredit;

}

@Override

public String toString() {

return "User [id=" + id + ", name=" + name + ", password=" + password

+ ", phone=" + phone + ", imageurl=" + imageurl + ", iscredit="

+ iscredit + "]";

}

}

登录的时候,后台返回的信息,我们需要把常用的用户信息保存到本地。

保存代码方法如下:

//保存用户信息

public void saveUser(User user){

SharedPreferences sp = this.getSharedPreferences("user_info", Context.MODE_PRIVATE);

SharedPreferences.Editor editor = sp.edit();

editor.putString("name",user.getName());

editor.putString("imageurl",user.getImageurl());

editor.putBoolean("iscredit",user.isCredit());

editor.putString("phone",user.getPhone());

editor.commit();//必须提交,否则保存不成功

}

读取用户信息方法如下:

//读取用户信息

public User readUser(){

SharedPreferences sp = this.getSharedPreferences("user_info", Context.MODE_PRIVATE);

User user = new User();

user.setName(sp.getString("name",""));

user.setImageurl(sp.getString("imageurl",""));

user.setPhone(sp.getString("phone",""));

user.setCredit(sp.getBoolean("iscredit",false));

return user;

}

退出登录的时候,需要把用户信息清除。代码方法如下:

public void logout(View view){//"退出登录"button的回调方法

//1、将保存在sp中的数据删除

SharedPreferences sp = this.getSharedPreferences("user_info", Context.MODE_PRIVATE);

sp.edit().clear().commit();//清除数据必须要提交:提交以后,文件仍存在,只是文件中的数据被清除了

//2、将本地保存的图片的file删除

File filesDir;

if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {//判断sd卡是否挂载

//路径1:storage/sdcard/Android/data/包名/files

filesDir = this.getExternalFilesDir("");

} else {//手机内部存储

//路径:data/data/包名/files

filesDir = this.getFilesDir();

}

File file = new File(filesDir, "icon.png");

if (file.exists()){

file.delete();//删除存储中的文件

}

//3、销毁所有的Activity

this.removeAll();

//4、重新进入首页面

goToActivity(MainActivity.class,null);

}

将bitmap图片保存到本地的操作

//将bitmap保存到本地的操作

/**

* 数据的存储。(5种)

* Bimap:内存层面的图片对象。

*

* 存储--->内存:

* BitmapFactory.decodeFile(String filePath);

* BitmapFactory.decodeStream(InputStream is);

* 内存--->存储:

* bitmap.compress(Bitmap.CompressFormat.PNG,100,OutputStream os);

*/

private void saveImage(Bitmap bitmap) {

File filesDir;

if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){//判断sd卡是否挂载

//路径1:storage/sdcard/Android/data/包名/files

filesDir = this.getExternalFilesDir("");

}else {//手机内部存储

//路径:data/data/包名/files

filesDir = this.getFilesDir();

}

FileOutputStream fos = null;

try {

File file = new File(filesDir,"icon.png");

fos = new FileOutputStream(file);

bitmap.compress(Bitmap.CompressFormat.PNG,100,fos);

} catch (FileNotFoundException e) {

e.printStackTrace();

}finally {

if (fos!=null){

try {

fos.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

读取本地保存的图片,并设置到相应的ImageView控件

//读取本地保存的头像图片

private void readImage(ImageView img) {

File filesDir;

if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {//判断sd卡是否挂载

//路径1:storage/sdcard/Android/data/包名/files

filesDir = this.getExternalFilesDir("");

} else {//手机内部存储

//路径:data/data/包名/files

filesDir = this.getFilesDir();

}

File file = new File(filesDir, "icon.png");

if (file.exists()){

//存储-->内存

Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());

img.setImageBitmap(bitmap);

}

}

Activity的管理器类代码如下:

import android.app.Activity;

import java.util.Stack;

/**

* 作者: willkong on 2017/10/31.

* 作用:统一应用程序中所有的Activity的栈管理(单例)

* 涉及到activity的添加、删除指定、删除当前、删除所有、返回栈大小的方法

*/

public class ActivityManager {

//单例模式:饿汉式

private ActivityManager(){

}

private static ActivityManager activityManager = new ActivityManager();

public static ActivityManager getInstance(){

return activityManager;

}

//提供栈的对象

private Stack activityStack = new Stack<>();

//activity的添加

public void add(Activity activity){

if(activity != null){

activityStack.add(activity);

}

}

//插曲:[12,3,44,6,332,65,-56,1]

//删除指定的activity

public void remove(Activity activity){

if(activity != null){

// for(int i = 0; i < activityStack.size(); i++) {

// Activity currentActivity = activityStack.get(i);

// if(currentActivity.getClass().equals(activity.getClass())){

// currentActivity.finish();//销毁当前的activity

// activityStack.remove(i);//从栈空间移除

// }

// }

for(int i = activityStack.size() - 1;i >= 0;i--){

Activity currentActivity = activityStack.get(i);

if(currentActivity.getClass().equals(activity.getClass())){

currentActivity.finish();//销毁当前的activity

activityStack.remove(i);//从栈空间移除

}

}

}

}

//删除当前的activity

public void removeCurrent(){

//方式一:

// Activity activity = activityStack.get(activityStack.size() - 1);

// activity.finish();

// activityStack.remove(activityStack.size() - 1);

//方式二:

Activity activity = activityStack.lastElement();

activity.finish();

activityStack.remove(activity);

}

//删除所有的activity

public void removeAll(){

for (int i = activityStack.size() - 1;i >= 0;i--){

Activity activity = activityStack.get(i);

activity.finish();

activityStack.remove(activity);

}

}

//返回栈大小

public int size(){

return activityStack.size();

}

}

用法是在基类BaseActivity中进行初始化,并编写操作方法。

在BaseActivity的onCreate方法中初始化管理器

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

//将当前的Activity添加到ActivityManager中

ActivityManager.getInstance().add(this);

}

//启动新的Activity

public void goToActivity(Class Activity,Bundle bundle){

Intent intent = new Intent(this,Activity);

if (bundle!=null&&bundle.size()!=0){

intent.putExtra("data",bundle);

}

startActivity(intent);

}

//销毁当前的Activity

public void removeCurrentActivity(){

ActivityManager.getInstance().removeCurrent();

}

//销毁所有的Activity

public void removeAll(){

ActivityManager.getInstance().removeAll();

}

图像处理工具类BitmapUtils.class

import android.graphics.Bitmap;

import android.graphics.Canvas;

import android.graphics.Matrix;

import android.graphics.Paint;

import android.graphics.PorterDuff;

import android.graphics.PorterDuffXfermode;

/**

* 作者: willkong on 2017/11/21.

* 作用:图像处理工具类

*/

public class BitmapUtils {

public static Bitmap circleBitmap(Bitmap source) {

int width = source.getWidth();

Bitmap bitmap = Bitmap.createBitmap(width, width, Bitmap.Config.ARGB_8888);

Canvas canvas = new Canvas(bitmap);

Paint paint = new Paint();

paint.setAntiAlias(true);

canvas.drawCircle(width / 2, width / 2, width / 2, paint);

//设置图片相交情况下的处理方式

//setXfermode:设置当绘制的图像出现相交情况时候的处理方式的,它包含的常用模式有:

//PorterDuff.Mode.SRC_IN 取两层图像交集部分,只显示上层图像

//PorterDuff.Mode.DST_IN 取两层图像交集部分,只显示下层图像

paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));

canvas.drawBitmap(source, 0, 0, paint);

return bitmap;

}

//实现图片的压缩处理

public static Bitmap zoom(Bitmap source,float w,float h){

Matrix matrix = new Matrix();

//图片的压缩处理

matrix.postScale(w / source.getWidth(),h / source.getHeight());

Bitmap bitmap = Bitmap.createBitmap(source,0,0,source.getWidth(),source.getHeight(),matrix,true);

return bitmap;

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/360500.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Visual studio代码行数统计

Visual studio代码行数统计 Visual Studio中的搜索功能支持正则表达式&#xff08;虽然语法比较诡异&#xff09;&#xff0c;我们完全可以通过正则表达式来遍历整个解决方案从而获得代码行数。 ^:b*[^:b#/].*$ 需要注意&#xff1a;#开头和/开头或者空行都不计入代码量。 如…

在JAX-RS中处理异步请求中的超时

JAX-RS 2.0在客户端和服务器端都支持异步编程范例。 这篇文章重点介绍了使用JAX-RS&#xff08;2.0&#xff09;API在服务器端执行异步REST请求时的超时功能 无需过多介绍&#xff0c;这里是一个快速概述。 为了以异步方式执行方法&#xff0c;您只需 需要指定AsyncResponse接…

strspn php,php返回在字符串中包含 charlist 参数中指定的字符数目的函数strspn()

实例返回在字符串 "Hello world!" 中包含字符 "kHlleo" 的数目&#xff1a;<?php echo strspn("Hello world!","kHlleo");?>定义和用法strspn() 函数返回在字符串中包含 charlist 参数中指定的字符数目。提示&#xff1a;请使…

Java十大简单性能优化

关于“ web scale ”这个流行词有很多炒作&#xff0c;人们花了很多时间来重新组织他们的应用程序体系结构&#xff0c;以使其系统“规模化”。 但是什么是扩展&#xff0c;我们如何确保可以扩展&#xff1f; 缩放的不同方面 上面提到的炒作主要是关于扩展负载 &#xff0c;即…

C#_获取汉字拼音

using System; using System.Collections.Generic; using System.Text; using System.Text.RegularExpressions; namespace Ctr.Common.Tools {/// <summary>/// 汉字转拼音静态类,包括功能全拼和缩写&#xff0c;方法全部是静态的/// </summary>public static cla…

php在苹果手机上传不了图片大小,ThinkPHP后台上传图片无默认尺寸解决方法

原标题&#xff1a;ThinkPHP后台上传图片无默认尺寸解决方法随着网站移动端的日益普及&#xff0c;对后台数据的兼容性要求也越来越高。后台数据涵盖范围不断扩大的同时&#xff0c;使得程序处理能力也必须逐步提高。使用ThinkPHP进行长沙网站开发时&#xff0c;后台kindeditor…

幂等与时间解耦之旅

HTTP中的幂等性意味着相同的请求可以执行多次&#xff0c;并且效果与仅执行一次一样。 如果用新资源替换某个资源的当前状态&#xff0c;则无论您执行多少次&#xff0c;最终状态都将与您仅执行一次相同。 举一个更具体的例子&#xff1a;删除用户是幂等的&#xff0c;因为无论…

开发者最容易犯的13个JavaScript错误

开发者最容易犯的JavaScript错误&#xff0c;总结出13个。这些当中可能少不了你犯的错误。我们描述了这些陋习&#xff0c;并列出来解决办法&#xff0c;希望对开发者有帮助。 1.for...数组迭代的用法 Usage of for..in to iterate Arrays 举例&#xff1a; var myArray [ “a…

php h2,微信连接失败:一直返回h2Moved/h2 (终于搞定了)

这几天都OK的&#xff0c;可以正常访问&#xff0c;统计数据上只出现过一次访问失败&#xff0c;但是平均耗时增加了30%估计是上次那个心脏滴血事件后&#xff0c;腾讯要求停用SSLv3&#xff0c;必须用TLSv1&#xff0c;但是之前一直没有停止SSLv3的支持&#xff0c;现在真停了…

使用Selenium进行Spring Boot集成测试

Web集成测试允许对Spring Boot应用程序进行集成测试&#xff0c;而无需进行任何模拟。 通过使用WebIntegrationTest和SpringApplicationConfiguration我们可以创建加载应用程序并在普通端口上侦听的测试。 Spring Boot的这一小增加使使用Selenium WebDriver创建集成测试变得更加…

begin ~~~

是时候需要用博客记录自己的code life了~~~ 大二暑假~~~ 需要的tech&#xff1a;php linux j2se ssh asp.net c#winform python htmlcssjsajax svngit转载于:https://www.cnblogs.com/tonyluj/p/3252185.html

在Spring MVC流中使用rx-java Observable

Spring MVC现在已经支持异步请求处理流程了一段时间&#xff0c;该支持内部利用了Tomcat / Jetty等容器的Servlet 3异步支持。 Spring Web Async支持 考虑一下需要花一点时间处理的服务呼叫&#xff0c;该服务呼叫具有延迟&#xff1a; public CompletableFuture<Message&…

宝塔php gd库,宝塔面板安装 EasyImag – 一款最简单图床的安装体验

近日闲逛&#xff0c;发现了一款图床&#xff0c;一款开箱即食的简单图床程序。因为没有数据库所以安装起来也是异常简单&#xff0c;我们看看功能&#xff1a;支持设置图片质量支持仅登录后上传支持QQ截图&#xff0c;剪切板上传支持在线管理(增删改查)支持上传图片转换为指定…

php order by where,无合适where条件过滤时尽量选择order by后的字段以驱动表进行查询...

后台查询语句SELECTo.orders_id,s.orders_status_name,ot.text,af.affiliate_idFROMordersoLEFTJOINorders_totalotON(o.orders_idot.orders_id)LEFTJOINaffilia后台查询语句SELECT o.orders_id, s.orders_status_name, ot.text ,af.affiliate_idFROM orders oLEFT JOIN orders…

零垃圾创建数百万个对象

如性能优化第一规则中所述&#xff0c;垃圾是快速代码的敌人。 通过使用垃圾收集器的服务&#xff0c;它不仅会破坏任何形式的确定性性能&#xff0c;而且我们开始在CPU高速缓存中填充垃圾&#xff0c;这将导致程序的高速缓存未命中。 那么&#xff0c;我们可以在不创建垃圾的…

[算法]单链表专题

如何判断链表环的入口位置&#xff1f; 一个指针从头开始单步走&#xff0c;一个指针从第一次相遇位置开始单步走&#xff0c;再相遇的位置就是环入口&#xff0c;证明如下&#xff1a; 设链表头到环入口位置距离为a&#xff0c;入口位置到第一次相遇位置为b&#xff0c;相遇位…

批准Oracle IDM中的特定Web服务

关于Web服务端点的快速发布&#xff0c;OIM和SOA在与批准有关的场景中使用了Web服务端点- 基本内容&#xff0c;但对于初学者可能有用 。 Oracle IDM与SOA套件集成并利用其提供与批准相关的功能&#xff08;说实话&#xff0c;SOA相当丰富&#xff0c;并且也被用作Web服务连接…

Oracle15001,Oracle11gR2RAC环境DBCA创建数据库报错ORA-15055ORA-15001

在Oracle 11gR2 GridInfrastructure和Database软件安装完成之后&#xff0c;执行DBCA创建数据库到30%的时候报如下错误&#xff0c;点击OK后提示忽略并问题现象:在Oracle 11gR2 GridInfrastructure和Database软件安装完成之后&#xff0c;执行DBCA创建数据库到30%的时候报如下错…

linux 下访问mysql

1&#xff1a;先进到root:/# /usr/local/mysql/bin/2&#xff1a;root:/# mysql -u root -p Enter password: 转载于:https://www.cnblogs.com/gaoyinghui/p/3255148.html

针对新手的Java EE7和Maven项目–第8部分

第1部分 &#xff0c; 第2部分 &#xff0c; 第3部分 &#xff0c; 第4部分 &#xff0c; 第5部分 &#xff0c; 第6部分 &#xff0c; 第7部分 第8部分 自上一篇文章以来&#xff0c;这一系列教程已经有很长时间了。 是时候恢复并在我们的简单项目中添加新功能了。 正…