在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。下面还需要一个重要的步骤,就是在
标签中使用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中使用。全局的,哈哈。
《android开发完全讲义(第2版)》(本书凯发k8网页登录的版权已输出到台湾)
《android高薪之路:android程序员面试宝典 》
新浪微博: 昵称:李宁_lining