Android博客应用,我应该使用Sharedpreferences还是Intents?

3
我正在开发一款安卓应用程序,当前用户的关注页面是可点击的,我会保存被点击的页面ID并传递给对应的页面进行打开。一旦打开,用户可以查看关注者列表、页面内的帖子等等。
以下是包含所有页面子节点的根节点(Firebase数据库结构): pageData
      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为null),我正在使用底部导航菜单进行导航。


编辑找到解决方案:Jeff Gilfelt,谢谢Android全局变量


3
为什么不创建一个SQLite数据库来实现这个功能呢? - Venky
@Venky 我考虑过了,但这只是一个值! - seekerGS
你可以将应用程序状态保存在bundle中,当调用onCreate时,可以获取该值。 - Ishan Fernando
2个回答

2

确实,你不应该滥用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并从不同的活动中检索它。 - seekerGS
将 PAGE_ID 修改为 "page_id",它是一个字符串键,用于保存/访问已保存的值。 - Teresa
我现在有些困惑,通常我们使用Util类将键存储为静态字符串,但我不确定这是否是您喜欢的。您能展示一些您的代码吗? - Teresa
我找到了一种方法(编辑了我的问题)公共类UtilsSaver扩展应用程序,我将使用一个类。 - seekerGS
1
哦不,请不要将数据存储在Application类中,它可能比Activity存在更长的时间,但您仍然面临NullPointerException的风险。这篇文章很好地解释了这一点:http://www.developerphil.com/dont-store-data-in-the-application-object/ - Teresa

1
实际上,将参数传递给子活动和片段的标准方式是通过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()。请注意,保留HTML标签。
. (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();
}
.
.
.

然后在调用活动中:
.
.
.
@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")


     }  

}

1
谢谢您详细的回答。我在从子活动返回时遇到了问题,您的答案解决了我的问题。 - seekerGS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接