登陸功能的操做邏輯步驟以下:能夠分爲五個步驟來實現。
一、進入頁面先判斷用戶是否已經登陸php
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(); } }
二、沒有登陸過,則提示用戶登陸,點擊後跳轉到登陸頁面java
//提示用戶登陸 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(); }
三、在登陸頁面中作登陸操做,登陸成功後保存相應的用戶信息到本地android
//保存用戶信息 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();//必須提交,不然保存不成功 }
四、用戶已經登陸過了,則加載並顯示相應的信息canvas
//加載用戶信息並顯示 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); }
五、退出登陸,須要清除本地保存的用戶信息app
public void logout(View view){//"退出登陸"button的回調方法 //一、將保存在sp中的數據刪除 SharedPreferences sp = this.getSharedPreferences("user_info", Context.MODE_PRIVATE); sp.edit().clear().commit();//清除數據必需要提交:提交之後,文件仍存在,只是文件中的數據被清除了 //二、將本地保存的圖片的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();//刪除存儲中的文件 } //三、銷燬全部的Activity this.removeAll(); //四、從新進入首頁面 goToActivity(MainActivity.class,null); }
登陸返回的信息實體類User.classide
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();//必須提交,不然保存不成功 }
讀取用戶信息方法以下:post
//讀取用戶信息 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; }
退出登陸的時候,須要把用戶信息清除。代碼方法以下:ui
public void logout(View view){//"退出登陸"button的回調方法 //一、將保存在sp中的數據刪除 SharedPreferences sp = this.getSharedPreferences("user_info", Context.MODE_PRIVATE); sp.edit().clear().commit();//清除數據必需要提交:提交之後,文件仍存在,只是文件中的數據被清除了 //二、將本地保存的圖片的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();//刪除存儲中的文件 } //三、銷燬全部的Activity this.removeAll(); //四、從新進入首頁面 goToActivity(MainActivity.class,null); }
將bitmap圖片保存到本地的操做this
//將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<Activity> 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; } }