博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 用application保存全局变量,关于Android中传递数据的一些讨论
阅读量:4941 次
发布时间:2019-06-11

本文共 2281 字,大约阅读时间需要 7 分钟。

在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。

(个人PS:有待检验)

注:如果经常使用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://blog.csdn.net/nokiaguy/article/details/5998986

转载于:https://www.cnblogs.com/xieyuan/p/3787377.html

你可能感兴趣的文章
Intel Galileo development documentation
查看>>
Jquery特效
查看>>
web服务器
查看>>
EV: Workaround to Allow Only One Instance or Window of outlook
查看>>
数据校验,
查看>>
IntelliJ IDEA完美解决tomcat8+乱码问题
查看>>
GDI+ ColorMatrix的完全揭秘
查看>>
破解电信光猫华为HG8120C关闭路由功能方法
查看>>
在Qt示例项目的C ++ / QML源中的//! [0]的含义是什么?
查看>>
【智能家居篇】wifi网络接入原理(上)——扫描Scanning
查看>>
操作引入xml文件的书包(定位到指定节点)
查看>>
操作系统学习笔记系列(一)- 导论
查看>>
CSS实例:图片导航块
查看>>
window的对象有哪些(笔记)
查看>>
Boolean Expressions
查看>>
They Are Everywhere
查看>>
数据结构--汉诺塔递归Java实现
查看>>
day14 多态与抽象
查看>>
Eclipse CDT 出现 launch failed Binary not found
查看>>
apache jmeter
查看>>