データのストレージとアクセス - SharedPreferences はユーザー設定パラメータを保存します


このセクションの概要:

このセクションでは、SharedPreferences (ユーザー設定パラメーターの保存) を使用してデータを保存する、ユーザー データを保存する 2 番目の方法を紹介します。 アプリケーションが、自動的にログインするかどうか、アカウントのパスワードを記憶するかどうか、Wifi を使用するかどうかなど、ユーザーの設定パラメータの一部を保存したい場合。 ネットワークやその他の関連情報についてデータベースを使用する場合、それは少しやりすぎのように思えます。上記の構成情報をユーザー設定と呼びます。 設定はユーザーの好みの設定であり、これらの構成情報は通常、特定のファイルに保存されます。たとえば、Windows は ini ファイルを使用します。 J2SE では、私たちが通常使用する Android のソフトウェア構成情報を保存するためにプロパティ ファイルと XML ファイルが使用されます。 軽量のストレージ クラス - ユーザー設定パラメータを保存する SharedPreferences! SharedPreferences も XML ファイルを使用します。 その後、Map コレクションと同様に、データはキーと値の形式で保存されます。SharedPreferences の getXxx(name) を呼び出すだけです。 キーに基づいて対応する値を取得できます。使い方はとても簡単です!


1. SharedPreferencesの使用例:

フローチャートの使用:

1.png

実装コード例:

レンダリングの実行:

プロセスはアカウントのパスワードを入力し、「ログイン」をクリックします情報を保存するには SharedPreference ファイルに保存します。 次に、アプリを再起動し、テキスト ボックスにデータが表示されていることを確認します

2.gif

保存後、ファイル エクスポーラーで data/data/<パッケージ名> を開き、shared_prefs ディレクトリで確認できます。 xml ファイルが生成されました (N5 にはルートがないため、以前のレンダリングは次のとおりです):

3.jpg

[デスクトップにエクスポート] をクリックして、内部のコンテンツを表示します:

4.jpg

コードの実装:

レイアウト ファイルの書き込みactivity_main.xmlの:

<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>

簡単なSPツールクラスの作成: SharedHelper.java:

/**
 * 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;
    }
}

最後に、MainActivity.java関連ロジックの実装:

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"));
    }
}

2. 他のアプリケーションの SharedPreferences

コアを読み取ります。 他のアプリのコンテキストを取得します。このコンテキストは、アプリのグローバル情報にアクセスするためのインターフェイスを表し、アプリの一意の識別を決定します。 これはアプリケーションのパッケージ名であるため、アプリケーションのパッケージ名を通じて対応するアプリのコンテキストを取得できます。 もう 1 つ注意すべき点は、他のアプリケーションの SP ファイルを読み書きできるかどうかの前提条件は、SP ファイルが読み取り可能または書き込み可能であることを指定しているかどうかであるということです。 上で作成した権限が MODE_PRIVATE の場合、書き込み権限は許可されません~つまり、他人の SP 内のデータを読み取るようなものです。 それに、SPに保存されているパスワードなどの一部の鍵情報は通常暗号化されているので、自分でしか書き込んでプレイすることはできません~。 一般的に使用されている MD5 暗号化方式については後ほど説明します。

実装フローチャート:

5.png

コード例:

レンダリングの実行:

6.png

コード実装:

SPを読み取る操作はMa inActivity.javaに配置されています完了したら、ボタンをクリックして SP を読み取り、トーストで表示します:

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();
            }
        });
    }
}

3. MD5 を使用して SharedPreference の重要なデータを暗号化します

上では、アカウントのパスワードを SP に直接保存しています (そうでない場合)。電話機がルート化されている場合、他のアプリケーションは電話機にアクセスできません。 あなたが root 権限を持っていて、データが他のアプリケーションによって取得され、何らかの結果を引き起こしたとしても...私たちを責める必要はありません(笑) 誰が応援しろって言ったんだ~、私たちは責任を負いません、それは本当です!しかし、責任あるアプリ開発者として、常にそうできるとは限りません。 そうですか? さらに、ユーザーのパスワードを暗号化するために、いくつかの暗号化アルゴリズムを使用することもできます。 誰もが暗号化処理プロセスを理解できるように、簡単な図を描いてみましょう:

1. 単純な暗号化処理プロセス

フローチャートは次のとおりです:

7.png

フローチャート分析:

  • ステップ1。ユーザーはアカウントとパスワードを確認した後(アカウントが重複していないか、パスワードの数が6桁を超えているかなど)、 つまり、アカウントのパスワードは有効です。登録が成功したら、アカウント番号とローカルで暗号化されたパスワードをサーバーに送信します。
  • ステップ 2。サーバーは、ユーザーが送信したアカウントと暗号化されたパスワードをサーバーのデータベースに保存します。 クライアントは平文パスワード (元の) パスワードを保存しません。
  • ステップ 3 クライアントに戻り、登録が成功した場合、またはログインが成功した場合は、アカウントのパスワードを SP に保存します。 暗号化プロセスも実行する必要があります。つまり、プレーン テキストのパスワード -> 暗号化して保存します。保存しない場合は、要求するたびに平文のパスワードが使用されます。 また、自宅でプロセスを実行し、暗号化されたパスワードを使用してサーバーにリクエストする必要があります。
  • ステップ 4. サーバーはアカウントと暗号化されたパスワードを検証し、成功すると、クライアントが後で保持できるセッション ID が割り当てられます。 このセッションは、サーバーが提供する関連サービスにアクセスするために使用されます。

ねえ、ご存知のとおり、多くの暗号化方法があります。Xiaozhu はこの分野の専門家ではありません。以前に使用されていた暗号化方法は MD5 です。 暗号化、このセクションでは、この MD5 暗号化の簡単な紹介とその使用法のデモンストレーションも行います~

2. MD5 の簡単な紹介:

1) MD5 とは何ですか? :

答え: メッセージ ダイジェスト アルゴリズム MD5 (中国名はメッセージ ダイジェスト アルゴリズム第 5 版) は、コンピューター セキュリティの分野で広く使用されています。 メッセージの整合性保護を提供するために使用されるハッシュ関数 - 「Baidu Encyclopedia」からの抜粋 簡単に言うと、MD5 を使用して文字列、ファイル、または圧縮パッケージを暗号化できる暗号化アルゴリズムです。 128 ビットの固定長の文字列を生成できます。この文字列は基本的に一意です。さらに、私たちは皆、16 進数を知っています。 4 ビットで表す必要がある場合、対応する MD5 文字列の長さは 128 / 4 = 32 ビットになります。別の可能性 一部の md5 は 16 ビットですが、32 ビット MD5 コードの最初の 8 ビットと最後の 8 ビットが削除されていることがわかります。信じないで、試してみましょう Baidu: md5 オンライン復号化、最初のもの: http://www.cmd5.com/

8.png

2) MD5 はクラックできますか?

答え: MD5 は不可逆です。つまり、対応するアルゴリズムがなく、生成された md5 値から元のデータを逆に取得することはできません。 もちろん、ブルートフォースクラッキングを除いて、単純なMD5暗号化後にMD5ライブラリを確認できます~

3) MD5値は一意ですか?

答え: 一意ではありません。1 つの元のデータは 1 つの MD5 値にのみ対応しますが、1 つの MD5 値は複数の元のデータに対応する可能性があります。


3. MD5 暗号化の実装例:

実際、インターネット上には、よく書かれた MD5 の例がたくさんあります。Xiaozhu が使用する MD5 暗号化ツールは次のとおりです。

Md5Util.java:

/**
 * 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();
    }
}

MainActivity.java getMD5 静的メソッドを直接呼び出します:

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

Logcat が次のように出力することがわかります:

9.png

これは暗号化されたものです (笑)、この暗号文の文字列を上記の 1 つの md5 オンライン復号にコピーできます。 website:

10.png

ふふ、確かに1回暗号化しただけで直接解読されました。ちょっと危険そうなので、100回暗号化してみましょう。 つまり、暗号化された文字列を再暗号化し、それを 100 回繰り返します。元のベースで暗号化するメソッドを 100 回追加します。次に、それを呼び出して、これを出力するログを見つけます。

11.png Copyインターフェースのウェブサイト 上:

12.png はい、インストールは成功しました~

4. SharedPreference ツールクラス:

SP 関連のクラスを毎回自分でインスタンス化するのは非常に面倒です。 SP ツールクラスは次のとおりです。誰でも投稿できます 私自身のプロジェクトでは、ツール クラスは、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;
}

5 コードのダウンロード:

SharedPreferenceDemo.zip

: SharedPreferenceDemo.zip をダウンロードSharedPreferenceDemo2.zip SharedPreferenceDemo2.zip をダウンロードSharedPreferenceDemo3.zipSharedPreferenceDemo3.zip をダウンロード

このセクションの概要:

さて、Android がデータを保存する 2 番目の方法について: SharedPreference は、ユーザー設定パラメーターの内容を保存します。全て、 SPの開発と使用の日常のニーズを満たすことができるはずです。不足しているものがあれば、遠慮なく指摘してください、ありがとうございます~