覆盖“共享首选项”中变量的值还是创建大量变量?

时间:2018-11-20 15:11:50

标签: java android android-studio

我刚接触Android,最近遇到了需要使用SharedPreferences的情况: 我有一个随项目进行而更改的变量,并且该应用程序根据变量的值在不同的屏幕中启动,例如,如果该值为0,则该应用程序应在LoginManager.class中启动,如果它是1,则其启动于MainActivity.class。

因此,每当我成功登录时,状态都会更改为1(这样就不必每次都登录),或者如果我注销状态则为0。
鉴于此,当然需要将变量保存在外部,以使值不会丢失,并在创建第一个屏幕时对其进行检索。

所以我的逻辑是我创建了一个onDestroy方法,以便当屏幕关闭任何全局变量“ state”时,将会得到SharedPreference变量“ sharedstate”(这是从我的初始Activity中获得的):

private SharedPreferences sharedPref;
public static int state=0;


protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);
    setContentView(R.layout.activity_first);
    pb = (ProgressBar) findViewById(R.id.pb);
    mContext = IntroManager.this;
    pb.setVisibility(ProgressBar.VISIBLE);
    CountDownTimer mCountDownTimer;
    pb.setProgress(i);
    sharedPref = mContext.getSharedPreferences("Apathy", Context.MODE_PRIVATE);
    getProfile();
    mCountDownTimer=new CountDownTimer(1500,1000) {
        @Override
        public void onTick(long millisUntilFinished) {
            Log.v("Log_tag", "Tick of Progress"+ i+ millisUntilFinished);
            i++;
            pb.setProgress((int)i*100/(1500/1000));
        }

        @Override
        public void onFinish() {
            check();
            i++;
            pb.setProgress(100);
        }
    };
    mCountDownTimer.start();
}

@Override
protected void onDestroy (){
    super.onDestroy();
    SharedPreferences.Editor editor = sharedPref.edit();
    editor.putInt("sharedstate", 1);
    editor.commit();
}

private void getProfile() {
    String sharedstate = sharedPref.getString("state", "");
    state= Integer.parseInt(sharedstate);
}

public void check(){
    if(state == 0){
        Intent mcrIntent = new Intent(IntroManager.this, LoginManager.class);
        startActivity(mcrIntent);
        overridePendingTransition(R.anim.slide_in, R.anim.slide_out);
    }else{
        if(state == 1){
            Intent mcrIntent = new Intent(IntroManager.this, MainActivity.class);
            startActivity(mcrIntent);
            overridePendingTransition(R.anim.slide_in, R.anim.slide_out);
        }
    }
}

所以我陷入了一个难题:如果我在所有屏幕上都使用相同的onDestroy方法(因为我无法预测应用程序将要关闭的位置),则会执行相同的“ sharedstate”更改其值或它创建了一堆称为Sharedstate的变量?他们是否保存在同一“冷漠”的东西中?

3 个答案:

答案 0 :(得分:0)

我相信这段代码会不断更新相同的值,并且不会重复。

如果您想查看共享首选项的外观,可以查看以下答案:How can I view the shared preferences file using Android Studio?

话虽如此,正如Vivart所写,每次onDestroy调用时都不必更新首选项,您只需要在登录成功或注销时进行更新

答案 1 :(得分:0)

每次Activity调用onDestroy时,它将覆盖相同的值。 SharedPreferences是自己的文件,保存在创建它们的手机上。标签“ Apathy”是文件名,“ sharedstate”是保存值的键。

这就是SharedPreferences的强大功能,您可以轻松保存原始数据。但是,在卸载该应用程序时,首选项也消失了。

也许正在寻找一些视频和教程,那里有很多。 Documentation确实很有帮助(但对于初学者来说有时很难理解)

答案 2 :(得分:0)

万一有人真的要找它,我设法做到了,我创建了一个新类来管理所有这些,在本例中称为“ Util_Preferencias”:

package com.example.user.mkpos;

import android.content.Context;
import android.content.SharedPreferences;
import static com.example.user.mkpos.IntroManager.state;


public class Util_Preferencias {

    Context miContexto;
    private SharedPreferences PreferenciasConfiguaracion;
    private  SharedPreferences.Editor editorPrefConfig;

    public Util_Preferencias(Context elContexto){
        miContexto=elContexto;
        PreferenciasConfiguaracion = miContexto.getSharedPreferences("PrefConfig",miContexto.MODE_PRIVATE);
        editorPrefConfig = PreferenciasConfiguaracion.edit();
    }


    public void GuardaPrefConfig(String estado){
        editorPrefConfig.putString("estado",estado);
        editorPrefConfig.commit();
    }

    public void CargaPref_Configuracion(){
        SharedPreferences prefs = miContexto.getSharedPreferences("PrefConfig",miContexto.MODE_PRIVATE);
        state = Integer.parseInt(prefs.getString("estado","0"));
    }

}

每当我需要给状态赋一个新值时,我称为GuardaPrefConfig,当我需要检索状态时,我使用CargaPref_Configuracion(通过在所需活动中调用类Uitl_Activity来实现)

Util_Preferencias UtilPreferencias = new Util_Preferencias(getApplicationContext());