您的位置:首页 > 移动开发 > Android开发

[一问一答][Android] 如何在两个Activity之间传递(共享)数据

2014-09-26 08:10 721 查看
对Android稍微有些了解的人,肯定一下就能回答出来,用intent,OK,当初有人面试我问的这个问题,我也是第一反应用intent,但面试官好像不太满意,因为我面的是高级工程师,:-)

所以今天就来个大总结,挖一挖还有没有别的方法,我大概总结了4个,欢迎牛人补充:

方法1:使用Intent

方法2:使用SharedPreference

方法3:使用static singleton

方法4:使用Application

下面一一举例:

方法1:使用Intent

1) 在当前Activity中,新生成一个intent,并添加数据:
Intent intent = new Intent(getApplicationContext(), NewActivity.class);
intent.putExtra("new_variable_name","value");
startActivity(intent);
2) 在另一个Activity (NewActivity)中,接受

Bundle extras = getIntent().getExtras();
if (null != extras) {
String value = extras.getString("new_variable_name");
}


注释:这也是大家经常用到的,用intent的优点是代码简单,实现方便,但也有缺点,intent只支持primitive和String类型,或Parcelable和Serializable的数据,对于其他数据类型无能为力,所以还需要别的办法。

方法2:使用SharedPreference

这个方法有点牵强,虽然可以实现,但SharedPreference更多的是被用来保存APP的配置信息,而且其也涉及到IO操作,速度上也慢些,不建议使用,这里不贴代码了,如果想用的,可以在网上搜索下。

方法3:使用static singleton

这个也可以只用static,为什么加了个singleton,因为我们在使用中,经常为把共享的数据作为一个单例模式来使用,好处是只创建一个实例。

先来看看只使用static的代码:

public class Person
{
public static int AGE      = 30;
public static String NAME = "Andrew";
}
在不同的Activity里直接操作即可,有人会说这里会不会有多线程的问题,由于我们只考虑在两个Activity传递数据,一般都是运行在UI thread,所以暂且不讨论多线程问题。

再来看看用static singleton:

public class MySingleton {
private static MySingleton sInstance;

public String customVar;

public static MySingleton getInstance() {
if (null == sInstance) {
sInstance = new MySingleton();
}
return sInstance;
}

private MySingleton() {

}

public void customSingletonMethod() {
}
}


其实上面也就是个单例模式的写法了,也没有考虑多线程的问题。这种方法可以实现同时多个Activity共享数据。

方法4:使用Application

这个方法建议使用,可以更好的控制数据的生命周期,代码如下:

public class MyApplication extends Application {

private String mValue;
@Override
public void onCreate() {
super.onCreate();
setValue("hello"); //set default value
}

public void setValue(String value) {
mValue = value;
}

public String getValue() {
return mValue;
}
}


当然还要在AndroidManifest.xml里生命Application. 这种方式其实是保存了一个全局变量,该全局变量的生命周期跟APP一样,所以可以很好的控制变量生命周期,不会产生memory leakage。在每个Activity里,只需调用getApplication()即可得到该Application对象,很方便。

引申方法5:3+4结合使用

还有人说,可以将方法3和4结合使用,也挺不错的,请参考http://www.devahead.com/blog/2011/06/extending-the-android-application-class-and-dealing-with-singleton/

public class MyApplication extends Application
{
@Override
public void onCreate()
{
super.onCreate();
// Initialize the singletons so their instances
// are bound to the application process.
initSingletons();
}

protected void initSingletons()
{
// Initialize the instance of MySingleton
MySingleton.getInstance();
}

public void customAppMethod()
{
// Custom application method
}

}


总结:

上面介绍了4中数据分享的方法,当然还有其他,但主要是这四种了:

1. 对于Intent.putExtras(), 一般是用于primitive,non-persistent的数据类型。

2. 对于SharedPreferency, 一般用于primitive, persistent的数据类型,对于persistent,还可以考虑database, file等方式

3. 对于static sington, 基本可以用于所有non-persistent的数据类型。

4. 对于Application, 也可以用于所有non-persistent的数据类型。

所以大家可以根据自己的实际需求来考虑采用那种方法。

另外Android论坛上也有一篇类似的文章讨论:

How do I pass data between Activities/Services within a single application?
http://developer.android.com/guide/faq/framework.html#3
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: