现在要做一个项目,多个Activity之间要共享数据,所以要考虑共享数据的方式。

其实有如下5种方式:

1.基于消息的通信机制  Intent ---bundle ,extra

数据类型有限,比如遇到不可序列化的数据Bitmap,InputStream, 或者LinkList链表等等数据类型就不太好用。

2. 利用static静态数据,public static成员变量;

3.基于外部存储的传输,  File/Preference/ Sqlite ,如果要针对第三方应用需要Content Provider

4.基于IPC的通信机制context 与Service之间的传输,如Activity与Service之间的通信,定义AIDL接口文件。

5. 基于Application Context

这里面我觉得第五种方法更具普适性,在网上找了篇讲解得好的文章,原文如下:

在Android中使用Intent在两个Activity间传递数据时,只能是基本类型数据,或者是序列化对象。Intent是一种基于消息的进程内和进程间通信模型,当我们需要在我们应用程序内部,多个Activity间进行复杂数据对象共享交互时,使用Intent就显得很不方便。此时,我们就需要一种数据共享的机制来实现。当然,直接使用java语言中的静态变量是可以的,但在Android中有更为优雅的实现方式。

The more general problem you are encountering is how to save stateacross several Activities and all parts of your application. A staticvariable (for instance, a singleton) is a common Java way of achievingthis. I have found however, that a more elegant way in Android is toassociate your state with the Application context.

--如想在整个应用中使用,在java中一般是使用静态变量,而在android中有个更优雅的方式是使用Application context。

As you know, each Activity is also a Context, which is informationabout its execution environment in the broadest sense. Your applicationalso has a context, and Android guarantees that it will exist as asingle instance across your application.

--每个Activity 都是Context,其包含了其运行时的一些状态,android保证了其是single instance的。

The way to do this is to create your own subclass of android.app.Application,and then specify that class in the application tag in your manifest.Now Android will automatically create an instance of that class andmake it available for your entire application. You can access it fromany context using the Context.getApplicationContext() method (Activityalso provides a method getApplication() which has the exact sameeffect):

--方法是创建一个属于你自己的android.app.Application的子类,然后在manifest中申明一下这个类,这是android就为此建立一个全局可用的实例,你可以在其他任何地方使用Context.getApplicationContext()方法获取这个实例,进而获取其中的状态(变量)。

class MyApp extends Application {
private String myState;
public String getState(){
return myState;
}
public void setState(String s){
myState = s;
}
}
class Blah extends Activity {
@Override
public void onCreate(Bundle b){
...
MyApp appState = ((MyApp)getApplicationContext());
String state = appState.getState();
...
}
}

对于Application的生命周期,今天测试了一下,Application类型在该APP被install的时候就已经实例化了,并且onCreate也已经被调用了。

如果需要创建类型里面可能需要用到的对象的话,就可以在构造函数里面实现,但是如果需要将该类型bind Service或者registerReceiver等操作时,需要将这些操作放到onCreate中,否则会抛出异常。其原因主要是这个对象还没有创建完成,此时你用这个对象来bindservice必然会出现意想不到的情况,所以在使用时还需要注意。

最新文章

  1. 在View and Data API中更改指定元素的颜色
  2. 【BZOJ-3122】随机数生成器 BSGS
  3. 【Hibernate】Hibernate系列6之HQL查询
  4. 批量处理_cmd_matlab
  5. jQuery 事件 - load() 方法
  6. trap在shell中捕捉信号
  7. poj 2312 Battle City
  8. 【WildCard Matching】cpp
  9. OpenSSL 1.0.0生成p12、jks、crt等格式证书的命令个过程(转)
  10. JAVA中IO和异常处理练习
  11. Linux权限相关操作命令
  12. 小程序:动态监测input和取值
  13. H5分享功能
  14. 微信小程序:下拉刷新
  15. jinja2模块使用教程
  16. SQLite中的SELECT子句
  17. ThreadLocal源码实现。
  18. 关于Spring Security中无Session和无状态stateless
  19. bookstrap table插件
  20. Size Balanced Tree

热门文章

  1. FPGA总结——杂谈
  2. python练习题-day14
  3. @Value("${xxxx}")注解的配置及使用
  4. docker安装和基础操作
  5. sklearn countvectorizer坑
  6. Cocos Creator - 入门教程项目 - 博客频道 - CSDN.NET
  7. PowerDesigner导出pdm设计为Word文档
  8. kubernetes1.4新特性(一):支持sysctl命令
  9. IE缓存清除
  10. URL与视图