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

         对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







  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值