Android数据共享

Android数据共享

 

         在Android应用程序开发的过程中,借助Bundle类对象来传递数据并不是在所有场景下都适用,就那简单的Intent类对象来说,就不能put进Bundle类对象中。当然不能否认,用Intent类对象来开启另一个Activity或者Service,并利用Bundle类对象来携带数据是个不错的形式,而且用途非常广泛,但不是万能的。

         关于在程序中共享数据,方法有很多,下面来看看到底有哪些是比较常用,哪些又是比较符合面向对象和高效、安全的。

  1、SharedPerferences

  首先来看在同一个Moudle中的两个文件(Activity界面)之间进行数据的共享。在分享数据的主类MainActivity的重载方法onCreate()中添加以下代码。

1 SharedPreferences shareData = getSharedPreferences("shared_data", MODE_WORLD_WRITEABLE);
2 SharedPreferences.Editor se = shareData.edit();
3 se.putString("shared_data1", "Hello World");
4 se.commit();
5 Intent intent = new Intent(MainActivity.this,GetData.class);
6 startActivity(intent);

  可以看到,在获取共享对象时指定了此次进行的共享标示("shared_data")与模式(MODE_WORLD_WRITEABLE),这个非常重要,前者作为其他地方构建共享对象的唯一标示,后者作为决定当前共享对象的读写模式。后面的Editor类对象主要完成了向共享对象中加载需要共享的数据,是以Key-Value的形式,这里只载入了一对数据(”shared_data1”-”Hello World”,Value的类型任意)。最后调用commit()方法进行提交后,在另外的Activity中即可进行共享数据的提取了。

  下面给出获取数据类GetData的onCreate()方法中做了哪些事。

1 SharedPreferences shareData = getSharedPreferences("shared_data", MODE_WORLD_READABLE);
2 getData = (TextView)findViewById(R.id.get_data);
3 getData.setText("shared_data1 = "+shareData.getString("shared_data1", "default"));

  很简单,利用共享对象直接调用getString()方法就可以通过Key来获取Value。

  但是问题来了,SharedPreferences.Editor类对象在加载数据时和Bundle类似,也是通过putType(Key, TypeValue )的形式,如果Type为Intent还是无能为力。

  2、Bundle

  Bundle类是结合Intent类一起使用的,下面给出简单的例子。启动另一个Avtivity时设置Bundle类对象。

1 Bundle bundle = new Bundle();
2 bundle.putString("Key", “Value”);
3 Intent intent = new Intent(MainActivity.this, OtherActivity.class);
4 intent.putExtras(bundle);
5 startActivity(intent);

         在OtherActivity类中获取数据:

1 Bundle bundle = this.getIntent().getExtras();
2 String value = bundle.getString("Key");

  3、Application 

  将共享数据的声明完全和使用文件分开,将耦合度降到最低,方法是将需要共享的数据全部声明在专门的一个类中。本来打算给出全部数据变量声明为静态变量的类中,考虑到和接下来将要给出的形式类似,而且从专业和安全性的角度不如后者,所以略过了。继承Application类来声明共享数据,并提供设置和提取数据的接口。

1 public class ShareData extends Application { 
2     private int shareData1; 
3     public int getData1() { 
4         return shareData1; 
5     } 
6     public void setData1 (int shareData1) { 
7         this. shareData1 = shareData1; 
8     } 
9 } 

         如果有多个数据,那么相应的设置和提取方法也要实现多个,有兴趣的小伙伴可以采用泛型的复用写出更加简洁的代码。注意,类SharedData中的方法(目标是数据)在整个工程的类中都是可以访问的,方法如下。

1 int shareData1 = ((ShareData)getApplicationContext()).getData1();

         那么重点来了,如果在类中声明一个Intent类的对象,很幸运的是用法和int型相同,那么就解决了其在不同文件之间的共享问题。之所以总是以Intent类对象来说事,是因为在某些情况下确实需要用到这个方法。如在继承Service类的子类中是不能直接利用startActivityForResult()方法的,自然就不会有重载onActivityResult()方法的机会,但是又要在该子类中利用onActivityResult()方法返回的Intent类对象。现在好了,可以将需要打开的Activity放在可以重载onActivityResult()方法的类(比如主类)中去实现,同时将返回的Intent对象赋给ShareData类中Intent类对象,然后,就OK了。

posted @ 2015-07-30 10:34  路上的脚印  阅读(1196)  评论(0编辑  收藏  举报