登陸和退出登陸的操做邏輯

登陸功能的操做邏輯步驟以下:能夠分爲五個步驟來實現。 
一、進入頁面先判斷用戶是否已經登陸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;
    }
}
相關文章
相關標籤/搜索