本文为原创,如需转载,请注明作者和出处,谢谢!
在Android中编写过程序的开发人员都知道。在Activity、Service等组件之间传递数据(尤其是复杂类型的数据)很不方便。一般可以使用Intent来传递可序列化或简单类型的数据。看下面的代码。
Intentintent=newIntent(this,Test.class);
intent.putExtra("param1","data1");
intent.putExtra("intParam1",20);
startActivity(intent);
这样就ok了。在当前Activity将两个值传到了Test中。但如果遇到不可序列化的数据,如Bitmap、InputStream等,intent就无能为力了。因此,我们很自然地会想到另外一种方法,静态变量。如下面的代码所
publicclassProductextendsActivity
{
publicstaticBitmapmBitmap;
}
对于上面的代码来说,其他任何类可以直接使用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,说干就干,下面来定义一个类。
packagenet.blogjava.mobile1;
importandroid.app.Application;
importandroid.graphics.Bitmap;
publicclassMyAppextendsApplication
{
privateBitmapmBitmap;
publicBitmapgetBitmap()
{
returnmBitmap;
}
publicvoidsetBitmap(Bitmapbitmap)
{
this.mBitmap=bitmap;
}
}
上面这个类和普通的类没什么本质的不同。但该类是Application的子类。对了,这就是使用Application Context的第一步,定义一个继承自Application的类。然后呢,就在这个类中定义任何我们想使其全局存在的变量了,如本例中的 Bitmap。下面还需要一个重要的步骤,就是在<application>标签中使用android:name属性来指定这个类,代码如 下:
<applicationandroid:name=".MyApp"android:icon="@drawable/icon"android:label="@string/app_name">
</application?
接下来的最后一步就是向MyApp对象中存入Bitmap对象,或从MyApp对象中取出Bitmap对象了,存入Bitmap对象的代码如
MyAppmyApp=(MyApp)getApplication();
Bitmapbitmap=BitmapFactory.decodeResource(this.getResources(),R.drawable.icon);
myApp.setBitmap(bitmap);
获得Bitmap对象的代码:
ImageViewimageview=(ImageView)findViewById(R.id.ivImageView);
MyAppmyApp=(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手机客户端(新浪微博)发布
分享到:
相关推荐
Intent可以携带一些数据,比如基本类型数据int、Boolean,或是String,或是序列化对象,Parcelable与Serializable。 Intent传递数据时,如果数据太大,可能会出现异常。比如App闪退,或是Intent发送不成功,logcat...
这是一个ppt文档,在里面详细的帮我们介绍了在Activity之间传递数据,通过全局变量传递数据。
JavaScript调用Android方法,向Android方法传递json数据。
android Intent传递对象数据 通过对象分别实现Serializable Parcelable接口的两种方法
我们知道在Android 系统中,可以用Bundle或Intent来保存和传递数据。我们有时由于程序某种需要,可能需要传递各种各样的自定义对象,只传递简单类型的数据是不够的。但这些对象在Activity之间不能直接传递,用什么...
Android Studio 3.0 下使用Intent传递数据和数据回传的示例。实现了一个简单的登录界面,用户输入用户名和密码后,点击登录把用户名和密码传递到主界面,主界面显示用户名和密码,然后在主界面中购买一个物品,打开...
4种最常用的Intent传递方式,这4种方式如下: 1、通过Intent传递数据 2、通过静态变量传递数据 3、通过剪切板传递数据 4、通过全局变量传递数据
Android开发中,在不同模块(如Activity)间经常会有各种各样的数据需要相互传递,我把常用的几种 方法都收集到了一起。它们各有利弊,有各自的应用场景。 我现在把它们集中到一个例子中展示,在例子中每一个按纽代表...
以不同方式实现了Activity之间的数据传递,并且当激活的activity在销毁时,主Activity可以得到返回的结果,适合初学者。
Android与webservice间数据传递所需类库,可参考我的博客中写的方法进行使用
我们可以通过Intent类中的putExtra方法可以将简单的数据类型和序列化对象保存到Intent对象中,然后在目标的Activity中使用getXxx方法取出对应的数据。
android 多线程 数据传递 handle 源代码 可以通过handle更新ui,提高客户体验
进程间传递对象数据时,要用到Parcelable及Service,该例子实现如何在进程间传递对象数据
Android PopupWindow与Activity之间的数据传递
Android-Activity之间数据传递的多种方式. 在不同模块(如Activity)间经常会有各种各样的数据需要相互传递,我把常用的几种 方法都收集到了一起。它们各有利弊,有各自己的应用场景。
在Activity之间数据传递中还有一种比较实用的方式 就是全局对象 实用J2EE的读者来说都知道Java Web的四个作用域 这四个作用域从小到大分别是Page Request Session和Application 其中Application域在应用程序的任何...
Android activity间的数据传递,选择头像。Android activity间的数据传递,选择头像。
一份可供学习的ndk开发示例 使用ndk r4b开发 主要示范如何从android java端传递数据结构以及从ndk接收数据结构 有相应教程: http://blog.csdn.net/hdw_191/archive/2011/02/16/6188852.aspx
Android 数据传递(Intent、Bundle、Serializable、Parcelable等),如项目包有问题请联系我谢谢
Android界面跳转传递参数封装