1. 使用 SharedPreferences 保存登录状态

要实现不同的登录账号有不同的笔记,并且在退出应用后再次启动时保持登录状态,除非用户手动退出登录,您可以通过以下步骤来实现:

1. 使用 SharedPreferences 保存登录状态

SharedPreferences 是 Android 提供的一种轻量级的数据存储方式,可以用于存储简单的键值对,如登录状态和当前登录的用户名。

在登录成功时保存登录状态和用户名

LoginActivity.java 中,您可以在用户成功登录后将登录状态和用户名保存到 SharedPreferences 中。

package com.example.notesapp;

import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

public class LoginActivity extends AppCompatActivity {
    private EditText usernameEditText, passwordEditText;
    private Button loginButton;
    private SQLiteDatabase db;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        usernameEditText = findViewById(R.id.username);
        passwordEditText = findViewById(R.id.password);
        loginButton = findViewById(R.id.login);

        // 初始化数据库
        NotesDBHelper dbHelper = new NotesDBHelper(this);
        db = dbHelper.getWritableDatabase();

        loginButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String username = usernameEditText.getText().toString();
                String password = passwordEditText.getText().toString();

                if (TextUtils.isEmpty(username) || TextUtils.isEmpty(password)) {
                    Toast.makeText(LoginActivity.this, "用户名和密码不能为空", Toast.LENGTH_SHORT).show();
                    return;
                }

                if (isValidLogin(username, password)) {
                    saveLoginState(username);
                    Intent intent = new Intent(LoginActivity.this, MainActivity.class);
                    intent.putExtra("username", username);
                    startActivity(intent);
                    finish();
                } else {
                    Toast.makeText(LoginActivity.this, "用户名或密码错误", Toast.LENGTH_SHORT).show();
                }
            }
        });

        // 检查是否已有登录状态
        checkLoginState();
    }

    private boolean isValidLogin(String username, String password) {
        Cursor cursor = db.query("users", null, "username=? AND password=?", new String[]{username, password}, null, null, null);
        boolean isValid = cursor.getCount() > 0;
        cursor.close();
        return isValid;
    }

    private void saveLoginState(String username) {
        SharedPreferences sharedPreferences = getSharedPreferences("LoginPrefs", Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putBoolean("isLoggedIn", true);
        editor.putString("username", username);
        editor.apply();
    }

    private void checkLoginState() {
        SharedPreferences sharedPreferences = getSharedPreferences("LoginPrefs", Context.MODE_PRIVATE);
        boolean isLoggedIn = sharedPreferences.getBoolean("isLoggedIn", false);
        if (isLoggedIn) {
            String username = sharedPreferences.getString("username", null);
            Intent intent = new Intent(LoginActivity.this, MainActivity.class);
            intent.putExtra("username", username);
            startActivity(intent);
            finish();
        }
    }
}

2. 在 MainActivity 中获取当前登录的用户名

MainActivity.java 中,您可以通过 IntentSharedPreferences 获取当前登录的用户名,并根据用户名加载对应的笔记。

package com.example.notesapp;

import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {
    private String username;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 获取用户名
        username = getIntent().getStringExtra("username");

        if (username == null) {
            SharedPreferences sharedPreferences = getSharedPreferences("LoginPrefs", Context.MODE_PRIVATE);
            username = sharedPreferences.getString("username", null);
        }

        if (username != null) {
            loadNotesForUser(username);
        }
    }

    private void loadNotesForUser(String username) {
        // 根据用户名加载笔记的逻辑
        // 您可以查询数据库并加载该用户的笔记
    }
}

3. 实现退出登录功能

SettingsFragment.java 或其他合适的位置实现退出登录功能。退出登录时,您需要清除 SharedPreferences 中的登录状态。

logoutButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        clearLoginState();
        Intent intent = new Intent(getActivity(), LoginActivity.class);
        startActivity(intent);
        if (getActivity() != null) {
            getActivity().finish();
        }
    }
});

private void clearLoginState() {
    SharedPreferences sharedPreferences = getActivity().getSharedPreferences("LoginPrefs", Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPreferences.edit();
    editor.clear();
    editor.apply();
}

4. 在 SplashActivity 中检查登录状态(可选)

您还可以添加一个 SplashActivity,在启动应用时先检查登录状态,然后决定跳转到 LoginActivity 还是 MainActivity

package com.example.notesapp;

import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;

import androidx.appcompat.app.AppCompatActivity;

public class SplashActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        SharedPreferences sharedPreferences = getSharedPreferences("LoginPrefs", Context.MODE_PRIVATE);
        boolean isLoggedIn = sharedPreferences.getBoolean("isLoggedIn", false);

        if (isLoggedIn) {
            String username = sharedPreferences.getString("username", null);
            Intent intent = new Intent(SplashActivity.this, MainActivity.class);
            intent.putExtra("username", username);
            startActivity(intent);
        } else {
            Intent intent = new Intent(SplashActivity.this, LoginActivity.class);
            startActivity(intent);
        }

        finish();
    }
}

5. 总结

通过以上步骤,您可以实现不同的登录账号拥有不同的笔记数据,并且在退出应用后再次启动时保持登录状态,除非用户手动退出登录。这种方式不仅能够提升用户体验,还可以保证用户数据的安全性。

你可能感兴趣的:(java)