我刚接触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的变量?他们是否保存在同一“冷漠”的东西中?
答案 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());