Storan dan akses data - SharedPreferences menyimpan parameter keutamaan pengguna


Pengenalan kepada bahagian ini:

Bahagian ini memperkenalkan anda kepada cara kedua untuk menyimpan data pengguna, menggunakan SharedPreferences (simpan parameter keutamaan pengguna) untuk menyimpan data. Apabila aplikasi kami ingin menyimpan beberapa parameter keutamaan pengguna, seperti sama ada untuk log masuk secara automatik, sama ada untuk mengingati kata laluan akaun dan sama ada untuk menggunakan Wi-Fi. Untuk rangkaian dan maklumat lain yang berkaitan, jika anda menggunakan pangkalan data, ia kelihatan agak berlebihan! Kami memanggil maklumat konfigurasi di atas keutamaan pengguna Tetapan ialah tetapan keutamaan pengguna, dan maklumat konfigurasi ini biasanya disimpan dalam fail tertentu! Sebagai contoh, Windows menggunakan fail ini, Dalam J2SE, fail sifat dan fail xml digunakan untuk menyimpan maklumat konfigurasi perisian dalam Android yang biasa kami gunakan Kelas storan ringan - SharedPreferences untuk menyimpan parameter keutamaan pengguna! SharedPreferences juga menggunakan fail xml, Kemudian, sama dengan koleksi Peta, data disimpan dalam bentuk nilai kunci; kita hanya perlu memanggil getXxx(nama) SharedPreferences, Anda boleh mendapatkan nilai yang sepadan berdasarkan kunci! Ia sangat mudah untuk digunakan!


1. Contoh penggunaan SharedPreferences:

Gunakan carta alir:

1.png

Contoh kod pelaksanaan:

Running effect diagram:

Prosesnya adalah untuk memasukkan kata laluan akaun dan klik log masuk, dan menyimpan maklumat ke SharedPreference fail. Kemudian mulakan semula apl dan lihat bahawa data telah dipaparkan dalam kotak teks

2.gif

Selepas menyimpan, kami boleh membuka data/data/<Nama Pakej> Lihat dalam direktori shared_prefs Fail xml telah dijana (kerana N5 tidak mempunyai akar, berikut ialah pemaparan sebelumnya):

3.jpg

Klik eksport ke desktop untuk melihat kandungan di dalamnya:

4.jpg

Pelaksanaan kod:

Penulisan fail susun atur activity_main.xml:

rreee

Menulis SP mudah kelas alat: SharedHelper.java:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MyActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="用户登陆" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:text="请输入用户名" />

    <EditText
        android:id="@+id/editname"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="用户名" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="请输入密码" />

    <EditText
        android:id="@+id/editpasswd"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="密码"
        android:inputType="textPassword" />

    <Button
        android:id="@+id/btnlogin"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="登录" />
</LinearLayout>

Akhirnya, MainActivity.java melaksanakan logik berkaitan:

/**
 * Created by Jay on 2015/9/2 0002.
 */
public class SharedHelper {

    private Context mContext;

    public SharedHelper() {
    }

    public SharedHelper(Context mContext) {
        this.mContext = mContext;
    }


    //定义一个保存数据的方法
    public void save(String username, String passwd) {
        SharedPreferences sp = mContext.getSharedPreferences("mysp", Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sp.edit();
        editor.putString("username", username);
        editor.putString("passwd", passwd);
        editor.commit();
        Toast.makeText(mContext, "信息已写入SharedPreference中", Toast.LENGTH_SHORT).show();
    }

    //定义一个读取SP文件的方法
    public Map<String, String> read() {
        Map<String, String> data = new HashMap<String, String>();
        SharedPreferences sp = mContext.getSharedPreferences("mysp", Context.MODE_PRIVATE);
        data.put("username", sp.getString("username", ""));
        data.put("passwd", sp.getString("passwd", ""));
        return data;
    }
}

2 Baca SharedPreferences

Teras aplikasi lain: Dapatkan Konteks apl lain dan Konteks ini mewakili antara muka untuk mengakses maklumat global apl dan menentukan pengenalan unik apl tersebut. Ia adalah nama pakej aplikasi, jadi kami boleh mendapatkan Konteks aplikasi yang sepadan melalui nama pakej aplikasi. Perkara lain yang perlu diberi perhatian ialah prasyarat sama ada fail SP aplikasi lain boleh dibaca dan ditulis ialah sama ada fail SP menyatakan boleh dibaca atau Kebenaran boleh ditulis tidak dibenarkan jika yang kami buat di atas adalah MODE_PRIVATE~ Jadi anda seperti membaca data dalam SP orang lain. Sukar Di samping itu, beberapa maklumat penting, seperti kata laluan yang disimpan dalam SP, biasanya disulitkan, jadi anda hanya boleh menulis dan bermain sendiri~ Saya akan bercakap tentang kaedah penyulitan MD5 yang biasa digunakan nanti!

Carta alir pelaksanaan:

5.png

Contoh kod:

Menjalankan rendering:

6.png

Pelaksanaan kod:

Operasi membaca SP kami diletakkan dalam MainActivity.java Completed dalam , klik butang untuk membaca SP dan memaparkannya melalui Toast:

public class MainActivity extends AppCompatActivity {

    private EditText editname;
    private EditText editpasswd;
    private Button btnlogin;
    private String strname;
    private String strpasswd;
    private SharedHelper sh;
    private Context mContext;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mContext = getApplicationContext();
        sh = new SharedHelper(mContext);
        bindViews();
    }

    private void bindViews() {
        editname = (EditText)findViewById(R.id.editname);
        editpasswd = (EditText)findViewById(R.id.editpasswd);
        btnlogin = (Button)findViewById(R.id.btnlogin);
        btnlogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                strname = editname.getText().toString();
                strpasswd = editpasswd.getText().toString();
                sh.save(strname,strpasswd);
            }
        });
    }

    @Override
    protected void onStart() {
        super.onStart();
        Map<String,String> data = sh.read();
        editname.setText(data.get("username"));
        editpasswd.setText(data.get("passwd"));
    }
}

3 Gunakan MD5 untuk menyulitkan data penting SharedPreference

Hei, apa yang kami ada. di atas Dengan cara ini, kata laluan akaun disimpan terus dalam SP Jika telefon tidak berakar, aplikasi lain tidak akan dapat mengakses telefon. Jika anda berakar dan data diperolehi oleh aplikasi lain, menyebabkan beberapa akibat, maka... anda tidak akan menyalahkan kami, haha, Siapa suruh anda root~, kami tidak bertanggungjawab, itu benar! Tetapi sebagai pembangun APP yang bertanggungjawab, kami tidak boleh selalu Betulkah itu? Kami boleh menggunakan beberapa algoritma penyulitan untuk menyulitkan kata laluan pengguna Selain itu, kami biasanya menyulitkan kata laluan pengguna! Di bawah kami melukis gambar rajah ringkas untuk membantu semua orang memahami proses pemprosesan penyulitan:

1 Proses pemprosesan penyulitan mudah

Carta alir adalah seperti berikut :

7.png

Analisis Carta Aliran:

  • Langkah 1 Pengguna mendaftarkan kata laluan akaun Selepas kata laluan akaun disahkan (sama ada akaun diduakan, bilangan digit kata laluan > 6 digit, dsb.) , Iaitu, kata laluan akaun adalah sah Selepas pendaftaran berjaya, kami menyerahkan nombor akaun kepada pelayan dan kata laluan yang disulitkan secara tempatan!
  • Langkah 2 Pelayan menyimpan nombor akaun dan kata laluan yang disulitkan yang diserahkan oleh pengguna ke pangkalan data pelayan, iaitu perkhidmatan. Pelanggan tidak menyimpan kata laluan teks jelas kami (asal) kata laluan!
  • Langkah 3 Kembali kepada pelanggan, jika pendaftaran berjaya atau log masuk berjaya, anda ingin menyimpan kata laluan akaun ke SP, kata laluan yang disimpan. Anda juga perlu melalui proses penyulitan! Iaitu, kata laluan teks biasa——>Sulitkan, kemudian simpan! Jika anda tidak menyimpannya, kata laluan teks yang jelas akan digunakan setiap kali anda memintanya. Anda juga perlu melalui proses di rumah, dan kemudian gunakan kata laluan yang disulitkan untuk meminta pelayan!
  • Langkah 4 Pelayan mengesahkan akaun dan kata laluan yang disulitkan, jika berjaya, pelanggan diberikan pengecam sesi, yang boleh dipegang oleh pelanggan kemudian. Sesi ini digunakan untuk mengakses perkhidmatan berkaitan yang disediakan oleh pelayan!

Hei, anda faham, terdapat banyak kaedah penyulitan Xiaozhu bukan pakar dalam bidang ini. Kaedah penyulitan yang digunakan sebelum ini ialah MD5. Penyulitan, bahagian ini juga memberi anda pengenalan ringkas kepada penyulitan MD5 ini dan demonstrasi penggunaannya~

2 Pengenalan ringkas kepada MD5:

1) Apakah itu MD5? :

Jawapan: Message Digest Algorithm MD5 (nama Cina ialah Message Digest Algorithm Edisi Kelima) digunakan secara meluas dalam bidang keselamatan komputer Fungsi cincang yang digunakan untuk menyediakan perlindungan integriti mesej - dipetik daripada "Baidu Encyclopedia" Ringkasnya, ia adalah algoritma penyulitan yang boleh menyulitkan rentetan, fail atau pakej termampat menggunakan MD5. Anda boleh menghasilkan rentetan dengan panjang tetap 128 bit! Rentetan ini pada asasnya unik! Di samping itu, kita semua tahu: heksadesimal Ia perlu diwakili oleh 4 bit, maka panjang rentetan MD5 yang sepadan ialah: 128 / 4 = 32 bit! Satu lagi kemungkinan Anda lihat bahawa sesetengah md5 ialah 16 bit, tetapi lapan bit pertama dan lapan terakhir kod MD5 32-bit dikeluarkan! Tak percaya, jom cuba Baidu: penyahsulitan dalam talian md5, yang pertama: http://www.cmd5.com/

8.png

2) Bolehkah MD5 retak?

Jawapan: MD5 tidak boleh diterbalikkan, yang bermaksud tiada algoritma yang sepadan dan data asal tidak boleh diperoleh secara terbalik daripada nilai md5 yang dijana! Sudah tentu, kecuali untuk retakan kekerasan, anda boleh menyemak perpustakaan MD5 selepas penyulitan MD5 yang mudah~

3) Adakah nilai MD5 unik?

Jawapan: Tidak unik Satu data asal hanya sepadan dengan satu nilai MD5, tetapi satu nilai MD5 mungkin sepadan dengan berbilang data asal.


3. Contoh pelaksanaan penyulitan MD5:

Malah, terdapat banyak contoh MD5 yang ditulis dengan baik di Internet Anda boleh mencari banyak daripadanya di Baidu atau Google berikut ialah kelas alat penyulitan MD5 babi kecil yang digunakan!

Md5Util.java:

public class MainActivity extends AppCompatActivity {

    private Context othercontext;
    private SharedPreferences sp;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button btnshow = (Button) findViewById(R.id.btnshow);
        btnshow.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //获得第一个应用的包名,从而获得对应的Context,需要对异常进行捕获
                try {
                    othercontext = createPackageContext("com.jay.sharedpreferencedemo", Context.CONTEXT_IGNORE_SECURITY);
                } catch (PackageManager.NameNotFoundException e) {
                    e.printStackTrace();
                }
                //根据Context取得对应的SharedPreferences
                sp = othercontext.getSharedPreferences("mysp", Context.MODE_WORLD_READABLE);
                String name = sp.getString("username", "");
                String passwd = sp.getString("passwd", "");
                Toast.makeText(getApplicationContext(), "Demo1的SharedPreference存的\n用户名为:" + name + "\n密码为:" + passwd, Toast.LENGTH_SHORT).show();
            }
        });
    }
}

MainActivity.java secara langsung memanggil kaedah statik getMD5:

/**
 * Created by Jay on 2015/9/2 0002.
 */
public class MD5 {
    public static String getMD5(String content) {
        try {
            MessageDigest digest = MessageDigest.getInstance("MD5");
            digest.update(content.getBytes());
            return getHashString(digest);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return null;
    }

    private static String getHashString(MessageDigest digest) {
        StringBuilder builder = new StringBuilder();
        for (byte b : digest.digest()) {
            builder.append(Integer.toHexString((b >> 4) & 0xf));
            builder.append(Integer.toHexString(b & 0xf));
        }
        return builder.toString();
    }
}

Kita dapat melihat bahawa Logcat mencetak:

9.png

Inilah yang berlaku selepas penyulitan. Kita boleh menyalin rentetan teks sifir ini ke tapak web penyahsulitan dalam talian md5 di atas:

10.png

Hei, sudah pasti, ia hanya disulitkan sekali seperti ini memecahkannya secara langsung Nampaknya agak tidak selamat, jadi hanya menyulitkannya 100 kali. Iaitu untuk menyulitkan rentetan yang disulitkan sekali lagi dan mengulanginya 100 kali Kami menambah kaedah menyulitkannya seratus kali pada asas asal:

Log.e("HeHe", MD5.getMD5("呵呵"));

Kemudian panggilnya dan cari Log yang mencetak ini:

11.png

Pada tapak web antara muka salinan:

12.png

Baiklah, memasang B berjaya~


4. Kelas Alat SharedPreference:

Mestilah sangat menyusahkan untuk membuat instantiate kelas berkaitan SP sendiri setiap kali Berikut ialah kelas alat untuk SP, anda boleh menyiarkannya Dalam projek saya sendiri, kelas alat datang dari blog Hong Yang~

SPUtils.java

public static String getMD5x100(String content){
    String s1 = content;
    for(int i = 0;i < 100;i++){
        s1 = getMD5(s1);
    }
    return s1;
}

Muat turun kod:

SharedPreferenceDemo.zipMuat turun SharedPreferenceDemo.zipSharedPreferenceDemo2.zipMuat turun SharedPreferenceDemo2.zipSharedPreferenceDemo2.zip: Muat turun SharedPreferenceDemo3.zip


Ringkasan bahagian ini:

Baiklah, tentang cara kedua Android menyimpan data: SharedPreference Sekian untuk menyimpan parameter keutamaan pengguna. Ia sepatutnya dapat memenuhi keperluan anda untuk pembangunan harian dan penggunaan SP Jika ada apa-apa yang kurang, sila sebutkan, terima kasih~