android 应用程序Activity之间数据传递与共享的几种途径(1)

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

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

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

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

4.基于IPC的通信机制

    context 与Service之间的传输,如Activity与Service之间的通信,定义AIDL接口文件。

   示例: http://www.eoeandroid.com/thread-36249-1-1.html

5. 基于Application Context, 例子如下文:


    在当前Activity将两个值传到了Test中。但如果遇到不可序列化的数据,如Bitmap、InputStream等,intent就无能为力了。因此,我们很自然地会想到另外一种方法,静态变量。如下面的代码所示:


    public  class  Product  extends  Activity
   {
         public  static  Bitmap mBitmap;
          
   }


    对于上面的代码来说,其他任何类可以直接使用Product中的mBitmap变量。这么做很easy、也很cool,但却very very wrong。我们千万不要以为Davlik虚拟机的垃圾回收器会帮助我们回收不需要的内存垃圾。事实上,回收器并不可靠,尤其是手机上,是更加的不可靠。 因此,除非我们要使自己的程序变得越来越糟糕,否则尽量远离static。

注:如果经常使用static的Bitmap、Drawable等变量。可能就会抛出一个在Android系统中非常著名的异常(以前budget这个单词一直记不住什么意思,自从经常抛出这个异常后,这个单词终于烂熟于心了, )

ERROR/AndroidRuntime(4958): Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget


    如果不使用static,总得有方法来代替它(尽管我很喜欢public static,我相信很多人也喜欢它,但为了我们的程序,建议还是忍痛割爱吧),那么这个新的解决方案就是本文的主题,这就是Application Context,相当于Web程序的Application,它的生命周期和应用程序一样长(这个我喜欢)。

    那么现在来看看如何使用这个Application Context。我们可以通过Context.getApplicationContext或Context.getApplication方法获得 Application Context。但要注意,我们获得的只是Context对象,而更理想的方法是获得一个类的对象。ok,说干就干,下面来定义一个类。


package  net.blogjava.mobile1;

import  android.app.Application;
import  android.graphics.Bitmap;

public  class  MyApp  extends  Application
{
     private  Bitmap mBitmap;

     public  Bitmap getBitmap()
    {
         return  mBitmap;
    }

     public  void  setBitmap(Bitmap bitmap)
    {
         this .mBitmap  =  bitmap;
    }
    
}


    上面这个类和普通的类没什么本质的不同。但该类是Application的子类。对了,这就是使用Application Context的第一步,定义一个继承自Application的类。然后呢,就在这个类中定义任何我们想使其全局存在的变量了,如本例中的 Bitmap。下面还需要一个重要的步骤,就是在标签中使用android:name属性来指定这个类,代码如 下:


< application  android:name =".MyApp"  android:icon ="@drawable/icon"  android:label ="@string/app_name" > 
 

更多相关文章

  1. Android(安卓)studio:Emulator: PANIC: Cannot find AVD system p
  2. Android(安卓)进阶——代码插桩必知必会之初识ASM7字节码操作库
  3. android 有关毫秒转时间的方法,及时间间隔等
  4. Android数据库升级、降级、创建(onCreate() onUpgrade() onDowng
  5. Android(安卓)adb 环境变量配置的坑 adb 不是内部或外部命令
  6. android之Android(安卓)Studio下自定义属性的定义和使用
  7. Android(安卓)Service 详解(上)
  8. Fragment和Activity之间传值的问题
  9. Android自定义View—小巧清爽的多节点进度条

随机推荐

  1. android performClick使用
  2. android表单上传出现java.lang.NoClassDe
  3. Android AES加密实现
  4. Android Activity 设置 窗口大小
  5. android 数据库 SQLiteOpenHelper和Conte
  6. 【翻译】(17)SYSV IPC
  7. android 音乐播放器汇总
  8. Android压缩图片和libjpeg库
  9. android:init.c
  10. Android中获取IMEI号