[一问一答][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只支持primitive和String类型,或Parcelable和Serializable的数据,对于其他数据类型无能为力,所以还需要别的办法。
方法2:使用SharedPreference
这个方法有点牵强,虽然可以实现,但SharedPreference更多的是被用来保存APP的配置信息,而且其也涉及到IO操作,速度上也慢些,不建议使用,这里不贴代码了,如果想用的,可以在网上搜索下。
方法3:使用static singleton
这个也可以只用static,为什么加了个singleton,因为我们在使用中,经常为把共享的数据作为一个单例模式来使用,好处是只创建一个实例。
先来看看只使用static的代码:
再来看看用static singleton:
其实上面也就是个单例模式的写法了,也没有考虑多线程的问题。这种方法可以实现同时多个Activity共享数据。
方法4:使用Application
这个方法建议使用,可以更好的控制数据的生命周期,代码如下:
当然还要在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/
总结:
上面介绍了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
所以今天就来个大总结,挖一挖还有没有别的方法,我大概总结了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
相关文章推荐
- Android成长之路-关于bundle实现两个activity之间的数据传递
- android 应用程序Activity之间数据传递与共享的几种途径(1)
- Android activity之间数据传递和共享的方式之Application
- Android如何在Activity和Service之间传递数据
- Android中在两个Activity之间进行数据传递
- android85--两个Activity之间怎么传递数据?
- android之如何在两个activity之间传递handler_利用broadcast广播机制
- Android成长之路-关于bundle实现两个activity之间的数据传递
- Android 应用程序Activity之间数据传递与共享的几种途径你知道吗
- Android 在两个 Activity 之间传递数据
- android 应用程序Activity之间数据传递与共享的几种途径(2)
- Android 在两个 Activity 之间传递数据
- android 应用程序Activity之间数据传递与共享的几种途径
- Android之两个activity之间传递数据且有返回值
- android 应用程序Activity之间数据传递与共享的几种途径
- Android中两个Activity之间数据传递及返回
- android 应用程序Activity之间数据传递与共享的几种途径(转)
- android 应用程序Activity之间数据传递与共享的几种途径
- Android中两个Activity之间数据传递及返回
- android 应用程序Activity之间数据传递与共享的几种途径