当前位置: 首页 > 知识库问答 >
问题:

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

耿招
2023-03-14

我对Android非常陌生,最近我陷入了一种情况,我需要使用共享偏好:我有一个变量,随着项目的发展而改变,应用程序根据变量的值在不同的屏幕上启动,例如,如果值是0,那么应用程序应该开始在LoginManager.class如果是1,那么它开始在Main Activity.class.

因此,每当我成功登录时,状态都会更改为1(因此我不必每次都登录),或者如果我注销,状态为0
考虑到这一点,当然变量需要保存在外部,以便值不会丢失,并在创建第一个屏幕时检索它。

因此,我的逻辑是创建一个onDestroy方法,这样当屏幕关闭时,无论全局变量“state”有什么,SharedReference变量“sharedstate”都将得到什么(这是我的初始活动):

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?他们是在同样的“冷漠”中得救的吗?

共有3个答案

乔宏峻
2023-03-14

如果有人真的在寻找它,我设法做到了,我创建了一个新的类来管理所有这些,在这种情况下称为“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"));
    }

}

每当我需要给state一个新值时,我就调用GuardaPrefConfig,当我需要检索时,我就使用CargaPref_Configuracion(通过调用所需活动中的类Uitl_Activity,如下所示:)

Util_Preferencias UtilPreferencias = new Util_Preferencias(getApplicationContext());
全冥夜
2023-03-14

我相信这段代码会一次又一次地更新相同的值,不会重复。

如果你想看看你的共享首选项是什么样子的,你可以看看这个答案:我如何使用Android Studio查看共享首选项文件?

也就是说,正如Vivart所写,每次调用onDestroy时都不需要更新首选项,您只需要在登录成功或注销时更新

章侯林
2023-03-14

每次活动调用onDestroy时,它将覆盖相同的值。共享首选项是保存在他们创建的手机上的自己的文件。标签“冷漠”是文件的名称,“共享状态”是保存值的关键。

这就是SharedReference的强大功能,您可以非常轻松地保存原始数据。但当卸载应用程序时,首选项也会消失。

也许可以找一些视频和教程,那里有很多。文档也非常有用(但有时对初学者来说很难理解)

 类似资料:
  • 你可以在怎么使用变量中所描述的方式来创建,初始化,保存及加载单一的变量.但是当创建复杂的模块时,通常你需要共享大量变量集并且如果你还想在同一个地方初始化这所有的变量,我们又该怎么做呢.本教程就是演示如何使用tf.variable_scope() 和tf.get_variable()两个方法来实现这一点. 问题 假设你为图片过滤器创建了一个简单的模块,和我们的卷积神经网络教程模块相似,但是这里包括两

  • 一般情况下,当一个传递给Spark操作(例如map和reduce)的函数在远程节点上面运行时,Spark操作实际上操作的是这个函数所用变量的一个独立副本。这些变量被复制到每台机器上,并且这些变量在远程机器上 的所有更新都不会传递回驱动程序。通常跨任务的读写变量是低效的,但是,Spark还是为两种常见的使用模式提供了两种有限的共享变量:广播变量(broadcast variable)和累加器(acc

  • Shared variables (共享变量)是为所有模板定义的变量。可以使用 setSharedVariable 方法向配置中添加共享变量: Configuration cfg = new Configuration(Configuration.VERSION_2_3_22); ... cfg.setSharedVariable("warp", new WarpDirective()); cfg

  • 问题内容: 我得到输出b 3。为什么它没有给出b13作为输出。任何人都可以解释一下。 问题答案: 假设Foo类声明如下 变量没有覆盖的概念。他们只是被蒙面。 它正在打印3,因为当您使用超类引用访问变量时,它仅访问在超类中声明的变量。 请记住,超类对子类一无所知。

  • 问题内容: 我正在使用“线程”模块在Python中进行项目。 如何创建一个全局变量(在我的情况下,我需要为True或False),以便项目中的所有线程(大约4-6)都可以访问? 问题答案: 我们可以在线程类外部定义变量,并在类的方法内部全局声明它。 请参见下面的简单示例,它交替打印AB。两个变量和在两个线程和之间共享。打印,然后设置为30。打印,因为已在中进行了修改。然后设置为20,再次用于中。这

  • 问题内容: 我正在研究JAVA中的重写成员函数,并考虑过尝试使用重写成员变量。 所以,我定义了类 输出为: 我不明白为什么当aRef设置为b时intVal仍然是A类? 问题答案: 当在子类中创建相同名称的变量时,这称为隐藏。现在,生成的子类实际上将同时具有这两个属性。你可以使用或从超类访问一个。变量甚至不必具有相同的类型。它们只是两个共享名称的变量,就像两个重载方法一样。