【问题标题】:Android Blog App, should I use Sharedpreferences or Intents?Android 博客应用程序,我应该使用 Sharedpreferences 还是 Intents?
【发布时间】:2018-05-02 08:45:41
【问题描述】:

我正在构建一个android应用程序,当前用户的关注页面是可点击的,我保存点击的页面id并传递它以打开相应的页面, 打开后,用户可以查看关注者列表、页面内的帖子等。

这是包含所有页面子节点(数据库 Firebase 结构)的根节点:

页面数据

      id1
         +page_id
         +page_name
         +page_posts
            -001
               -post_id
               -contents
               ....

userData
      -001
         -user_id
         -user_name
         ....

followData
      -001 
        -page_id
        -follow_id
        -user_id

在(followersListActivity、PostsActivity、AboutPageActivity)之间传递页面 id 的最佳方式是什么?

我读过这个https://github.com/flutter/flutter/issues/15307,它说不使用共享首选项,我已经使用意图来传递值,并在onCreate() 中检索它,但是当活动状态发生变化时(onStart() page_id 为空),我正在使用底部导航菜单进行导航。


编辑找到解决方案:Jeff Gilfelt 谢谢 Android global variable

【问题讨论】:

  • 为什么不创建一个 SQLite 数据库来完成这项工作??
  • @Venky 我想过,但这只是一个值!
  • 可以将app状态保存在bundle中,调用onCreate时获取值

标签: android firebase android-intent sharedpreferences


【解决方案1】:

您不应该滥用 sharePreferences 在活动之间传递数据是正确的,您始终可以使用 onSaveInstanceState 方法保存数据:

@Override
protected void onSaveInstanceState(Bundle outState) {
  super.onSaveInstanceState(outState);
  outState.putString("page_id", pageID);
}

并从 onRestoreInstanceStateonCreate 检索它:

@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
  super.onRestoreInstanceState(savedInstanceState);
  pageID = savedInstanceState.getString("page_id");
}

@Override
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  if (savedInstanceState!=null)
    pageID = savedInstanceState.getString("page_id");
}

【讨论】:

  • 感谢您的回答,您的方法是在活动状态更改时保存数据,我更关心的是保存id并从不同的活动中检索它
  • 修改PAGE_ID为“page_id”,是一个字符串key,用来保存/访问保存的值。
  • 我现在很困惑,通常我们使用 Util 类将键存储为静态字符串,但我不确定这是否是您喜欢的。你能展示一些你的代码吗?
  • 我找到了一种方法(编辑了我的问题)公共类 UtilsSaver 扩展了应用程序,我将使用一个类
  • 哦,不,请不要将数据存储在 Application 类中,它可能比 Activity 寿命更长,但您仍然面临 NullPointerException 的风险。这篇文章解释得很好:developerphil.com/dont-store-data-in-the-application-object
【解决方案2】:

其实给子activity和fragment传递参数的标准方式是通过Intents。您可以传递任何原始值、原始对象的任何数组[]、一些 ArrayLists,甚至任何Parcelable 对象,

我在我的代码中使用以下例程:

public static void runChildActivity(@NonNull Activity context, int code, @NonNull Class<? extends Activity> activityClass, @Nullable Bundle parameters) {
        Intent intent = new Intent(context, activityClass);
        if (parameters != null) intent.putExtras(parameters);
        context.startActivityForResult(intent, code);
}

然后,你可以这样称呼它:

Bundle parameters = new Bundle();
parameters.putString("page_id", xxxx);
parameters.putFloat("temperature", 24.5f);
parameters.putParcelable("complexobject", yourParcelableObject);

runChildActivity(context, CODE, PostsActivity.class, parameters);

参数CODE (int) 是您分配给activity 的代码,以防万一它也返回值。然后,您可以在调用活动中检查覆盖的onActivityResult() 中的返回值。如果您的活动没有返回任何值,则该参数无关紧要。

在子活动中,您可以在onCreate(或它之后的任何位置)中获取参数:

@Override
public void onCreate(Bundle savedInstanceState) {

    Bundle parameters = getIntent().getExtras();

    // in a fragment it'd be
    // Bundle parameters = getArguments();

    // those are the parameters passed. Second value is default
    // value in case parameter is not found.

   String pageId = parameters.getString("page_id", "-1");
   float temperature = parameters.getFloat("temperature", 0f);

}

如果您想将子活动中的内容返回给父活动,则在子活动中使用setResult() finish()

. (child activity)
.
.
private void finishWithParameters() {

    Bundle parameters = new Bundle();
    parameters.putString("returnvalue", "user is crazy");
    parameters.putInteger("filesdownloaded", 43);
    Intent i = new Intent();
    i.putExtras(parameters);
    setResult(Activity.RESULT_OK, i);
    finish();
}
.
.
.

然后在调用activity中:

.
.
.
@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {

     if (requestCode == CODE && data != null) {
        // that's the CODE we ran runChildActivity() with
        // so stuff is coming from that child activity

        Bundle parameters = data.getExtras();
        int filesDownloaded = parameters.getInt("filesDownloaded")

        // ... or directly, without even getting the bundle ....

        int filesDownloaded2 = data.getIntExtra("filesDownloaded")


     }  

}

【讨论】:

  • 感谢您的详细回答,我从孩子活动中回来时遇到了问题,您的回答可以解决问题
猜你喜欢
  • 1970-01-01
  • 2016-05-31
  • 1970-01-01
  • 1970-01-01
  • 2011-09-07
  • 2019-02-16
  • 1970-01-01
  • 2013-02-16
  • 1970-01-01
相关资源
最近更新 更多