1. 程式人生 > >安卓實戰之登入介面設計

安卓實戰之登入介面設計

安卓實戰之登入介面設計


執行環境:

windows10+ Android Studio2.3.3 +API 21

(適用android 5.0以上版本的手機)


(1)知識儲備

(知識儲備連結:https://blog.csdn.net/biggerchong/article/details/83015407

Activity:表示當前手機的整個介面(一頁)

              OnCreate( ): 當頁面被建立時被activity回撥,方法中常加入初始化實現

              onStart( ):當頁面顯示時被activity回撥

              onRestart( ):重新啟動activity時被回撥,總是在onStart()之後執行

              onPause( ):快速暫停activity

              onResume( ):當Activity由暫停狀態恢復為活動狀態時被回撥

              onStop( ):當頁面被隱藏時被activity回撥

              onDestory( ):銷燬activity時被回撥

 

Intentactivity之間跳轉的橋樑,直接通過putExtra( )傳遞/回傳資料;還可以利用Bundle先對有用的資料加工,

            再利用putExtra(               )傳遞資料。(Bundle物件可以包含所有putEextra()傳遞的資料)

            (注:ActivityIntent具體可查閱android官方文件https://developer.android.google.cn/guide/components/intents-filters

 

Mob簡訊驗證碼:http://wiki.mob.com/sdk-sms-android-3-0-0/ 官方文件教學,主要用到mob自身封裝的回撥機制

                          (注意在清單xml中新增相應的許可權,不然是收不到簡訊驗證資訊的)

 

Mysql資料庫:目前Android版本強制規定用執行緒來使用資料庫(增刪改查等),防止介面執行緒被卡死。

                       (資料庫的連線操作將在伺服器部署部分詳細講解)


(2)專案流程


(3)介面設計

             主介面                             登入介面

   

                註冊介面                                  設定密碼


 (4)響應設計

1、點選登入圖示:

//點選登陸

 ImageButton imBtn_login=(ImageButton)findViewById(R.id.imBtn_login);

 imBtn_login.setOnClickListener(new View.OnClickListener()

 {

      @Override

      public void onClick(View v)

 {

       //頁面跳轉,並請求獲取資料

    Intent intent= new Intent(MainActivity.this,LoginActivity.class);

          startActivityForResult(intent,REQUESTMAIN);  //會進行回撥得到想要的資料

      }

  });

2、取回指定的資料:

  //通過重寫onActivityResult來取回資料

@Override

    protected void onActivityResult(int requestCode, int resultCode, Intent data)

    {

        // 是否 REQ_GET_INPUT 的返回

        if (requestCode == REQUESTMAIN&&resultCode == 103)

        {

            // 從intent中取出資料

            user.userID= data.getStringExtra("userID");

            user.userName= data.getStringExtra("userName");

            user.userPwd= data.getStringExtra("userPwd");

            user.userPhone=data.getStringExtra("userID");

            user.status=Boolean.valueOf(data.getStringExtra("status"));

        }



        if (requestCode == REQUESTMAIN&&resultCode == 104)

        {

            // 從intent中取出資料

            user.userPwd= data.getStringExtra("loginPwd");

            user.userPhone=data.getStringExtra("loginPhone");

            TextView userName=(TextView)findViewById(R.id.textView_mainName);

            userName.setText(user.userPhone);

            TextViewmainGrade=

(TextView)findViewById(R.id.textView_mainGrade);

            mainGrade.setText(user.userPwd);

        }

}

說明:

整套登入介面的總體流程大致就是按照這樣一套模式來進行的,注意的是在註冊完畢並且設定密碼完成後頁面將會按需返回,意思就是activity都存在一個棧中,建立的時候在壓棧;銷燬的時候在拋棧。當設定密碼完畢後此介面就會自動回撥onDestory( )來銷燬該介面並返回到註冊介面,但是這裡我設定成介面不顯示但資料還在往會傳,當資料從註冊介面傳回到登入介面後,利用再銷燬註冊介面(只需要一個finish( )就可以了,使當前介面不顯示,資料傳輸完畢自動或人為銷燬介面

3、優化方案:

i、採用MD5對密碼加密

原理介紹:MD5以512位分組來處理輸入的資訊,且每一分組又被劃分為16個32位子分組,經過了一系列的處理後,演算法的輸出由四個32位分組組成,將這四個32位分組級聯後將生成一個128位雜湊值。填充方法:在訊息後面進行填充,填充第一位為1,其餘為0。

(連結:http://libin52008.blog.163.com/blog/static/105327187201186981459/

網上這種東西大部分都是你抄我,我抄你參考價值不高;這裡只是簡單的介紹,然後copy程式碼;有興趣可以專攻喲!(網路海洋龐大,知識無窮無盡,你懂的!)

(還可以使用(AES+base64+PBE)更加高階安全的方法來加密,不過操作起來稍微複雜一些,這裡就使用java自帶的MD5來加密解密)

import java.io.UnsupportedEncodingException;

import java.security.MessageDigest;

import java.security.NoSuchAlgorithmException;



/**

 * 採用MD5加密解密

 */

public class MyTest {

    private static final String TAG = "MD5Util";



    /***

     * MD5加碼 生成32位md5碼

     */

    public static String string2MD5(String inStr) {

     

        MessageDigest md5 = null;

        try {

            md5 = MessageDigest.getInstance("MD5");

        } catch (Exception e) {

            System.out.println(e.toString());

            e.printStackTrace();

            return "";

        }

        char[] charArray = inStr.toCharArray();

        byte[] byteArray = new byte[charArray.length];



        for (int i = 0; i < charArray.length; i++)

            byteArray[i] = (byte) charArray[i];

        byte[] md5Bytes = md5.digest(byteArray);

        StringBuffer hexValue = new StringBuffer();

        for (int i = 0; i < md5Bytes.length; i++) {

            int val = ((int) md5Bytes[i]) & 0xff;

            if (val < 16)

                hexValue.append("0");

            hexValue.append(Integer.toHexString(val));

        }

        return hexValue.toString();



    }



    /**

     * 加密解密演算法 執行一次加密,兩次解密

     */

    public static String convertMD5(String inStr) {

       

        char[] a = inStr.toCharArray();

        for (int i = 0; i < a.length; i++) {

            a[i] = (char) (a[i] ^ 't');

        }

        String s = new String(a);

        return s;



    }



    // 測試主函式

public static void main(String args[])

{

       String s = new String("shenchong");

       System.out.println("原始:" + s+s.le);

       System.out.println("MD5後:" + string2MD5(s));

       System.out.println("加密的:" + convertMD5(s));

       System.out.println("解密的:" + convertMD5(convertMD5(s))+ convertMD5(convertMD5(s)).length());



    }

}

ii、實現延時自動登入

SharePreferneces官方介紹https://developer.android.google.cn/reference/android/content/SharedPreferences

// 儲存當前使用者資訊,以便下一次開機啟動時載入
    SharedPreferences sharedPref = getPreferences(Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPref.edit();
    editor.putString("username", username);
    editor.putString("password", password);
    editor.commit();


// 從配置里加載
    SharedPreferences sharedPref = getPreferences(Context.MODE_PRIVATE);
    String username = sharedPref.getString("username", "");
    String password = sharedPref.getString("password", "");
    if(username.length() >0 && password.length() > 0)
    {
        // 自動填寫使用者名稱和密碼
        ((EditText) findViewById(R.id.id_username)).setText(username);
        ((EditText) findViewById(R.id.id_password)).setText(password);
        // 延時N毫秒後自動登入
        autoLogin();
    }


//延時登入

Handler msgHandler = new Handler();
    // 延時後自動登入
    private void autoLogin()
    {
        msgHandler.postDelayed(new Runnable()
        {
            @Override
            public void run()
            {
                doLogin(null);
            }
        }, 1500);

    }

iii、防止sql注入(字元轉義)

      password=password.replace(" ' ", " /' ");

       password=password.replace(" ` ", " /` ");

利用replace()函式將String進行轉義,避免MySql中` 與 ' 這些特殊字元的出現而非法進入使用者資訊。


(5)問題總結和完善

設計中最開始對activity跳轉流程模糊導致走了很多彎路,開發過程中現有一個清晰的模組流程感,不然很難有序高效的開發。本次Login模組的開發可以拓展到很多新的知識,最關鍵的提高個人對activity與Intent的理解與使用,懂得什麼時候activity被建立、被銷燬、被啟動等。

 

登入設計模組原始碼以上傳github:https://github.com/SCAsMessi/JavaStudy/tree/master/CSDN/Android%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/LoginDesign/ForeignShopping

加油!歡迎評論,一起進步!