关于Android中传递数据的一些讨论

简介: 本文为原创,如需转载,请注明作者和出处,谢谢!      在Android中编写过程序的开发人员都知道。在Activity、Service等组件之间传递数据(尤其是复杂类型的数据)很不方便。

本文为原创,如需转载,请注明作者和出处,谢谢!

     在Android中编写过程序的开发人员都知道。在Activity、Service等组件之间传递数据(尤其是复杂类型的数据)很不方便。一般可以使用Intent来传递可序列化或简单类型的数据。看下面的代码。

     Intent intent  =   new  Intent( this , Test. class );
     intent.putExtra(
" param1 " " data1 " );
     intent.putExtra(
" intParam1 " 20 );
     startActivity(intent);

     这样就ok了。在当前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。下面还需要一个重要的步骤,就是在<application>标签中使用android:name属性来指定这个类,代码如 下:

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

</ application?

    接下来的最后一步就是向MyApp对象中存入Bitmap对象,或从MyApp对象中取出Bitmap对象了,存入Bitmap对象的代码如

 

    MyApp myApp  =  (MyApp)getApplication();
        
    Bitmap bitmap 
=  BitmapFactory.decodeResource( this .getResources(), R.drawable.icon);
        
    myApp.setBitmap(bitmap);

 

    获得Bitmap对象的代码:

 

    ImageView imageview  =  (ImageView)findViewById(R.id.ivImageView);
        
    MyApp myApp 
=  (MyApp)getApplication();
        
    imageview.setImageBitmap(myApp.getBitmap());

    上面两段代码可以在任何的Service、Activity中使用。全局的,哈哈。




 


新浪微博:http://t.sina.com.cn/androidguy   昵称:李宁_Lining

华章培训网视频教程:实现Android版的多功能日历

《Android/OPhone开发完全讲义》(本书版权已输出到台湾)

样章和目录下载
 
互动网
当当网  卓越亚马逊

《人人都玩开心网:Ext JS+Android+SSH整合开发Web与移动SNS》

script.txt文件下载
样章下载
互动网
乐博Android手机客户端(新浪微博)发布

目录
相关文章
|
7天前
|
Android开发 开发者
Android网络和数据交互: 请解释Android中的AsyncTask的作用。
Android&#39;s AsyncTask simplifies asynchronous tasks for brief background work, bridging UI and worker threads. It involves execute() for starting tasks, doInBackground() for background execution, publishProgress() for progress updates, and onPostExecute() for returning results to the main thread.
6 0
|
1月前
|
存储 XML 编译器
【Android 从入门到出门】第二章:使用声明式UI创建屏幕并探索组合原则
【Android 从入门到出门】第二章:使用声明式UI创建屏幕并探索组合原则
48 3
|
4月前
|
Android开发
Android Studio App开发入门之在活动之间传递消息(附源码 超详细必看)(包括显示和隐式Intent,向上一个和下一个Activity发送数据)
Android Studio App开发入门之在活动之间传递消息(附源码 超详细必看)(包括显示和隐式Intent,向上一个和下一个Activity发送数据)
44 0
|
Java Maven Android开发
Android组件化开发(四)--进程保活组件的封装
前面文章我们封装了网络请求组件`lib_nework`和图片加载组件`lib_image_loader`,今天我们来封装一个进程保活的组件`lib_pull_alive`
|
设计模式 存储 算法
从Android代码中来记忆23种设计模式2
从Android代码中来记忆23种设计模式
从Android代码中来记忆23种设计模式2
|
设计模式 安全 Java
从Android代码中来记忆23种设计模式
从Android代码中来记忆23种设计模式
|
编解码 开发工具 Android开发
关于Android的一些设计
  谈到应用程序设计,对设计师来说,Android就像是房间里的大象。很多设计师会更希望这是iOS,在那里所有任何人都只需要关心iPhone手机,iPad和App Store。然后没有人可以忽略Android,它目前已占据智能手机中最大的市场份额,且已经被广泛用于从平板电脑到电子阅读器等各种产品。
1092 0
|
Java Linux Android开发
关于Android设计及其意义
> 2019.3.12:修改第三部分 ##1. 引言 ##        现实工作中经常可以听到一些言论:框架的升级带来协议性能的提升、编程模式的变革带来业务的飞跃...... 姑且不论这些表述是否有问题,实际上如果系统地看待事物,可能会有不太一样的发现。以LINUX为例,尽管其内核大获成功,但如果不是遵循POSIX、并成为一个开源、精简的U
4491 0