在活动中保存数据

时间:2018-07-17 01:43:40

标签: java android android-intent

我有2个活动,第一个是从用户那里获取图像。第二个活动从谷歌地图获取数据。但是,如果我使用意图从第一个活动调用第二个活动,而又使用另一个意图返回第一个活动,则数据消失了。有什么方法可以保存图像和第二个活动返回的数据?

3 个答案:

答案 0 :(得分:2)

有几个可用选项。您现在可能最容易使用的是使用共享的偏好设置:

<nav class="navbar">
        <ul class="navbar__ul">
            <span class="left">
                <li class="navbar__li"> <a href="#"> Coffee </a>  </li>
                <li class="navbar__li"> <a href="#"> Tea </a>  </li>
                <li class="navbar__li"> <a href="#"> Menu </a>  </li>
                <li class="navbar__li"> <a href="#"> Recipes  </a>  </li>
            </span>

            <div class="logo__box">
                <a href="index.html"> <img class="logo" src="https://upload.wikimedia.org/wikipedia/en/thumb/d/d3/Starbucks_Corporation_Logo_2011.svg/1200px-Starbucks_Corporation_Logo_2011.svg.png"> </a>
            </div>

            <span class="right">
                <li class="navbar__li"> <a href="#"> Blog </a>  </li>
                <li class="navbar__li"> <a href="#"> Gift Cards </a>  </li>
                <li class="navbar__li"> <a href="#"> Reviews </a>  </li>

                <span class="log__sign">
                    <li class="navbar__li log__signLi"> <a href="#" class="log__signBtn"> Login </a> </li>
                    <li class="navbar__li log__signLi"> <a href="#" class="log__signBtn"> Sign Up </a> </li>
                </span>
            </span>
        </ul>
    </nav>

这将包含图像的字节数组存储为字符串。然后,在下一个活动中,您可以通过以下方式检索它:

SharedPreferences prefs = this.getSharedPreferences("com.your.app", Context.MODE_PRIVATE);
byte[] image;  // populate this byte array with your image
String key = "myimagekey";
String imgString = new String(image, "UTF-8");
prefs.edit().putString(key, imgString).apply();

另一个选择,也许是更多的工作,是配置您的应用程序可以使用的SQLite数据库。然后,您可以简单地将图像作为BLOB插入到某个表中,然后在下一个活动中从同一表中读取。

答案 1 :(得分:0)

您可以将图像或大数据保存到内部存储器(android doc)或将其他较小的数据(例如数组列表,对象)保存到与gson共享的首选项中(有关信息,请参见this tutorial)。

希望这会有所帮助!

答案 2 :(得分:0)

根据情况,有两种方法可以实现您想要的。

最常见的情况(这听起来像您的情况)是使用子Activity来获取用户输入时-例如从列表中选择联系人或在对话框中输入数据。在这种情况下,您应该使用startActivityForResult来启动子活动。

这提供了使用setResult将数据发送回主活动的管道。 setResult方法采用一个int结果值和一个Intent,该Intent传递回调用方Activity。

Intent resultIntent = new Intent();
// TODO Add extras or a data URI to this intent as appropriate.
resultIntent.putExtra("some_key", "String data"); 
setResult(Activity.RESULT_OK, resultIntent);
finish();

要在调用活动中访问返回的数据,请覆盖onActivityResult。 requestCode对应于startActivityForResult调用中传入的整数,而resultCode和数据Intent是从子Activity返回的。

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
  super.onActivityResult(requestCode, resultCode, data);
  switch(requestCode) {
    case (MY_CHILD_ACTIVITY) : {
      if (resultCode == Activity.RESULT_OK) {
        // TODO Extract the data returned from the child Activity.
        String returnValue = data.getStringExtra("some_key");
      }
      break;
    } 
  }
}