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

时间:2018-05-02 08:45:42

标签: android firebase android-intent sharedpreferences

我正在构建一个Android应用程序,当前用户的后续页面是可点击的,我保存点击的页面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,它说不使用共享首选项,我已经使用了Intents传递值,并在onCreate()内检索它,但是当活动状态发生变化时(onStart() page_id为null),我用于导航底部导航菜单。

发现

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

2 个答案:

答案 0 :(得分:2)

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

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

并从 onRestoreInstanceState onCreate 检索它:

@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");
}

答案 1 :(得分: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()

. (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")


     }  

}