在Android应用程序中的活动之间传递数据

时间:2015-03-12 08:03:24

标签: java android android-intent android-activity

嘿,我是制作Android应用程序的新手,我明白在两个活动之间传递数据的最简单方法是通过意图。

在我的一个类(EventOptions.java)中,我调用了这行代码:

Intent i = new Intent(EventOptions.this, PhotoFetcher.class);
i.putExtra("imageArray", imageIDs); 
startActivity(i);

imageIDs是一个字符串数组

在我的PhotoFetcher类中,我想将一个名为imageIDs的字符串数组设置为我通过intent传递的imageIDs字符串数组。

我想在我的班级中将图像设置为全局变量:

public class MainActivity extends Activity implements View.OnClickListener{

    Intent it = getIntent();
    String[] imageIDs = it.getStringArrayExtra("imageArray");
    ...
}

然而,这会崩溃我的应用程序。这是不允许的?如果是这样,我该如何解决?提前致谢!

4 个答案:

答案 0 :(得分:1)

需要在方法中而不是在类级别调用getIntent()。在onCreate内调用它:

public void onCreate(Bundle savedInstanceState){
  super.onCreate(savedInstanceState);
   // get Intent here
    Intent it = getIntent();
    String[] imageIDs = it.getStringArrayExtra("imageArray");
}
  

如果我想在另一个定义的公共类中使用imageIDs数组   在我的PhotoFetcher课程中,我是否需要再次调用它?

要在imageIDs类中获取PhotoFetcher,请将String [] imageIDs声明为全局变量,或使用imageIDs类构造函数传递PhotoFetcher

答案 1 :(得分:0)

您必须使用putStringArrayListExtra。您可以先将String []转换为ArrayList。

喜欢这样

ArrayList<String> arrayList = new ArrayList<String>(Arrays.asList(imageIDs));
Intent i = new Intent(EventOptions.this, PhotoFetcher.class);
i.putStringArrayListExtra("imageArray", arrayList); 
startActivity(i);

然后你可以像你一样获取它,最好是在onCreate或之后。

Intent it = getIntent();
ArrayList<String> imageIDs = it.getStringArrayListExtra("imageArray");

答案 2 :(得分:0)

在不保留磁盘的情况下共享数据

通过将活动保存在内存中,可以在活动之间共享数据,因为在大多数情况下,两个活动都在同一个流程中运行。

注意:有时,当用户离开您的活动时(不退出),Android可能决定终止您的应用程序。在这种情况下,我遇到了一些情况,其中android尝试使用在应用程序被杀之前提供的意图启动最后一个活动。在这种情况下,存储在单件(您的或应用程序)中的数据将消失,并且可能发生不良事件。为了避免这种情况,您可以将对象保存到磁盘或检查数据,然后再使用它来确保数据有效。

使用单件类

有一个整数数据的课程:

public class DataHolder {
  private String data;
  public String getData() {return data;}
  public void setData(String data) {this.data = data;}

  private static final DataHolder holder = new DataHolder();
  public static DataHolder getInstance() {return holder;}
}
From the launched activity:

String data = DataHolder.getInstance().getData();

使用应用程序单例(我建议这样做)

应用程序单例是android.app.Application的一个实例,它是在启动应用程序时创建的。您可以通过扩展应用程序来提供自定义:

import android.app.Application;
public class MyApplication extends Application {
  private String data;
  public String getData() {return data;}
  public void setData(String data) {this.data = data;}
}

在启动活动之前:

MyApplication app = (MyApplication) getApplicationContext();
app.setData(someData);

然后,从已启动的活动开始:

MyApplication app = (MyApplication) getApplicationContext();
String data = app.getData();

答案 3 :(得分:0)

KρяσѕρєяK击中了头部的钉子,你正在运行一个构造者和领域的方法。要使变量(imageIDs)成为全局变量,它非常简单,并且有几种方法可以实现。在任何方法之外声明它们,然后在onCreate或onResume(将始终被调用)中分配它们。

试试这个:

public class MainActivity extends Activity implements View.OnClickListener {
 //global variable
String[] imageIDs;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // get Intent here
        Intent it = getIntent();
        imageIDs = it.getStringArrayExtra("imageArray");
    }

}