zoukankan      html  css  js  c++  java
  • 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了。

  • 相关阅读:
    Java字符编码问题
    Andrew Ng机器学习公开课笔记 -- 支持向量机
    Andrew Ng机器学习公开课笔记 -- 朴素贝叶斯算法
    Andrew Ng机器学习公开课笔记 -- Generative Learning algorithms
    Andrew Ng机器学习公开课笔记 -- Generalized Linear Models
    技术书单整理
    Andrew Ng机器学习公开课笔记 -- Logistic Regression
    Andrew Ng机器学习公开课笔记 -- 线性回归和梯度下降
    统计学习方法笔记 -- 决策树
    POJ1037 A decorative fence 【动态规划】
  • 原文地址:https://www.cnblogs.com/tgyf/p/4688504.html
Copyright © 2011-2022 走看看