即使在应用关闭时,共享首选项也会永久传递给另一个活动

Posted

技术标签:

【中文标题】即使在应用关闭时,共享首选项也会永久传递给另一个活动【英文标题】:Shared Preferences passed to another activity permanently even on app close 【发布时间】:2015-10-19 11:55:22 【问题描述】:

我有这个活动,它将使用意图将值传递给 mainactivity,并尝试对其进行烘烤以查看它是否传递了值并且我实现了它! 意味着它的工作,我也使用 sharedpreferences 将这些值保存到 textview。但是当我关闭应用程序并尝试再次使用 toast 来检查它是否具有来自另一个活动的值而不使用意图时,toast 什么也不显示。

有什么方法可以同时使用共享首选项将其永久保存在 mainactivity 中?

编辑

主活动

SA prefcontacts;

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

    Intent intent = getIntent();
    final String prefcon1 = intent.getStringExtra("prefcon1");
    final String prefcon2 = intent.getStringExtra("prefcon2");
    final String prefcon3 = intent.getStringExtra("prefcon3");
    final String prefcon4 = intent.getStringExtra("prefcon4");
    final String prefcon5 = intent.getStringExtra("prefcon5");      

    Button show = (Button)findViewById(R.id.button3);

    show.setOnClickListener(new OnClickListener() 

        @Override
        public void onClick(View v)
        
            Toast.makeText(getApplicationContext(), prefcon1, Toast.LENGTH_SHORT).show();
            Toast.makeText(getApplicationContext(), prefcon2, Toast.LENGTH_SHORT).show();
            Toast.makeText(getApplicationContext(), prefcon3, Toast.LENGTH_SHORT).show();
            Toast.makeText(getApplicationContext(), prefcon4, Toast.LENGTH_SHORT).show();
            Toast.makeText(getApplicationContext(), prefcon5, Toast.LENGTH_SHORT).show();
        
    );

SA.class

    EditText et1, et2, et3, et4, et5;

Button btnSave;

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_s);
    btnSave = (Button)findViewById(R.id.btnSave);



    et1 = (EditText)findViewById(R.id.editText1);
    et2 = (EditText)findViewById(R.id.editText2);
    et3 = (EditText)findViewById(R.id.editText3);
    et4 = (EditText)findViewById(R.id.editText4);
    et5 = (EditText)findViewById(R.id.editText5);

    SharedPreferences settings = getSharedPreferences("MY_PREFS", 0);
    et1.setText(settings.getString("prefcon1", ""));
    et2.setText(settings.getString("prefcon2", ""));
    et3.setText(settings.getString("prefcon3", ""));
    et4.setText(settings.getString("prefcon4", ""));
    et5.setText(settings.getString("prefcon5", ""));

    btnSave.setOnClickListener(new OnClickListener() 

        @Override
        public void onClick(View v) 
            finish();
            Toast.makeText(getApplicationContext(), "Preferences Saved!", Toast.LENGTH_LONG).show();
            Intent intent = new Intent (SA.this, MainActivity.class);
            intent.putExtra("prefcon1", et1.getText().toString());
            intent.putExtra("prefcon2", et2.getText().toString());
            intent.putExtra("prefcon3", et3.getText().toString());
            intent.putExtra("prefcon4", et4.getText().toString());
            intent.putExtra("prefcon5", et5.getText().toString());
            startActivity(intent);

        
    );

【问题讨论】:

How to use SharedPreferences in android to store, fetch and edit values的可能重复 使用该链接中的示例,将您的数据保存到活动 1 中的首选项,并在 mainactivity 中检索它 分享代码。|如果您使用的是 saharedprefrences,则无需将其传递给另一个活动,它可用于整个应用程序 @TimCastelijns 我认为情况不同 很难说。你没有告诉我们很多关于你的情况 【参考方案1】:

列出的

intent.putExtra("prefcon1", et1.getText().toString());
            intent.putExtra("prefcon2", et2.getText().toString());
            intent.putExtra("prefcon3", et3.getText().toString());
            intent.putExtra("prefcon4", et4.getText().toString());
            intent.putExtra("prefcon5", et5.getText().toString());

//PUT

SharedPreferences.Editor editor = s.edit();
        editor.putString();
        editor.commit("prefcon2", et2.getText().toString());
        editor.commit("prefcon3", et3.getText().toString());
        editor.commit("prefcon4", et4.getText().toString());
        editor.commit("prefcon5", et5.getText().toString());
editor.commit();

【讨论】:

【参考方案2】:

SharedPreference 是全局的。这不是特定于活动的。因此,一旦您从任何 Activity 或 Fragment 在 SharedPreference 中保存了一些数据,这些数据将在任何其他 Activity 或 Fragment 中可用,即使您再次关闭并打开应用程序也是如此。

如果您要将数据保存在 SharedPreference 中,那么通过 Intent 传递它是没有意义的(如果您使用 commit() 而不是 apply())。

【讨论】:

如果您要将数据保存在 SharedPreference 中,那么通过 Intent 传递它是没有意义的。 对此无法确定。根据您是否使用 commit()apply() 编写首选项,创建新活动时首选项可能尚不可用 是的。完全忘记了。谢谢。

以上是关于即使在应用关闭时,共享首选项也会永久传递给另一个活动的主要内容,如果未能解决你的问题,请参考以下文章

Unity C# - 单击按钮将游戏对象传递给另一个 C# 脚本 [关闭]

共享首选项值更改时视图不更新

Java中的持久性[关闭]

活动关闭时共享首选项空指针异常[重复]

如何在不使用共享首选项的情况下将数据存储为颤动的对象[关闭]

使用共享首选项保存和重新加载 ListView [保存 onDestroy()]