关于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月前
|
消息中间件 安全 Java
Linux源码阅读笔记13-进程通信组件上
Linux源码阅读笔记13-进程通信组件上
|
7月前
|
Linux
Linux源码阅读笔记13-进程通信组件中
Linux源码阅读笔记13-进程通信组件中
|
10月前
|
前端开发
【零基础入门前端系列】—伪对象选择器(十七)
【零基础入门前端系列】—伪对象选择器(十七)
|
程序员 API Windows
[笔记]Windows核心编程《番外篇》几种Hook类型
[笔记]Windows核心编程《番外篇》几种Hook类型
112 0
进程间通信——有名管道原理及详解(附有案例代码)
进程间通信——有名管道原理及详解(附有案例代码)
|
存储 Unix Shell
进程间通信——匿名管道原理及详解(附有案例代码)
进程间通信——匿名管道原理及详解(附有案例代码)
|
图形学
一文读懂Unity常用生命周期函数! 超级详细、不服来辩~
零基础学习Unity常用什么周期函数,超级详细的解析,不看会后悔哦~
6754 0
一文读懂Unity常用生命周期函数! 超级详细、不服来辩~
|
缓存 iOS开发
iOS网络编程之二——NSURLSession的简单使用
iOS网络编程之二——NSURLSession的简单使用
325 0
|
Java Linux Android开发
关于Android设计及其意义
> 2019.3.12:修改第三部分 ##1. 引言 ##        现实工作中经常可以听到一些言论:框架的升级带来协议性能的提升、编程模式的变革带来业务的飞跃...... 姑且不论这些表述是否有问题,实际上如果系统地看待事物,可能会有不太一样的发现。以LINUX为例,尽管其内核大获成功,但如果不是遵循POSIX、并成为一个开源、精简的U
4560 0
|
编解码 开发工具 Android开发
关于Android的一些设计
  谈到应用程序设计,对设计师来说,Android就像是房间里的大象。很多设计师会更希望这是iOS,在那里所有任何人都只需要关心iPhone手机,iPad和App Store。然后没有人可以忽略Android,它目前已占据智能手机中最大的市场份额,且已经被广泛用于从平板电脑到电子阅读器等各种产品。
1137 0