对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