189 8069 5689

android的全局变量,android定义变量

android 如何定义全局变量

找到一个和我有类似需求的问题,其下给出了不错的解决方案,也正是我之前想到的,这种方法貌似很方便。 The more general problem you are encountering is how to save stateacross several Activities and all parts of your application. A staticvariable (for instance, a singleton) is a common Java way of achievingthis. I have found however, that a more elegant way in Android is toassociate your state with the Application context. --如想在整个应用中使用,在java中一般是使用静态变量,而在android中有个更优雅的方式是使用Application context。 As you know, each Activity is also a Context, which is informationabout its execution environment in the broadest sense. Your applicationalso has a context, and Android guarantees that it will exist as asingle instance across your application. --每个Activity 都是Context,其包含了其运行时的一些状态,android保证了其是single instance的。 The way to do this is to create your own subclass of android.app.Application,and then specify that class in the application tag in your manifest.Now Android will automatically create an instance of that class andmake it available for your entire application. You can access it fromany context using the Context.getApplicationContext() method (Activityalso provides a method getApplication() which has the exact sameeffect): --方法是创建一个属于你自己的android.app.Application的子类,然后在manifest中申明一下这个类,这是 android就为此建立一个全局可用的实例,你可以在其他任何地方使用Context.getApplicationContext()方法获取这个实例,进而获取其中的状态(变量)。

公司主营业务:成都网站设计、做网站、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。成都创新互联公司是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。成都创新互联公司推出合水免费做网站回馈大家。

在Android中如何使用全局变量--Application context (转)

可以将变量存放在Application中,Context,中文直译为“上下文”,SDK中对其说明如下:

Interface to global information about an application environment. This is an abstract class whose implementation

is provided by the Android system. It allows access to application-specific resources and classes, as well as up-calls

for application-level operations such as launching activities, broadcasting and receiving intents, etc。

从上可知一下三点即:

1、它描述的是一个应用程序环境的信息,即上下文。

2、该类是一个抽象(abstract class)类,Android提供了该抽象类的具体实现类(后面我们会讲到是ContextIml类)。

3、通过它我们可以获取应用程序的资源和类,也包括一些应用级别操作,例如:启动一个Activity,发送广播,接受Intent信息等。

以下为使用Application存储全局变量的示例代码:

1.继承Application,并在Application里声明全局变量。

public class MyApplication extends Application {

private User user;

public User getUser() {

return user;

}

public void setUser(User user) {

this.user = user;

}

}

2.在AndroidManifest.xml的application节点中声明这个Application。

application android:name="com.xxx.xxx.MyApplication"

3.在Activity中获取Application对象,并存取全局变量。

User user = new User();

user.setUserName("example");

MyrApplication app= (MyApplication ) getApplicationContext();

app.setUser(user); //将变量存到application

User tmp = app.getUser();//从application中读取全局变量。

android使用全局变量.求解答@慈税。

使用静态类:

public class Data{    private static String a ="Hello Android";    public static String getA() {        return a;

}    public static void setA(String a) {

 Data.a = a;

}

}123456789101112

调用就不再写了,直接使用类名.变量名就可以调用!

static修饰的静态变量,使用很方便,在不同的类和包中都可以使用,在虚拟机中单独占用内存,没错,这些都是它们的优点,不过在项目上线后,才发现static有一些不太好的地方。

在查看项目的崩溃信息时,发现很多地方莫明的出现空指针异常的错误,经过排查,发现可能就是static的问题。我们在项目中,将用户的信息也就是User对象保存成了一个静态变量,而在报错的地方,也都发现有使用过这种变量,因此,可以大致推断出与这种保存的方式有一定的联系。同时,有不少用户反映在打开应用的情况下,接个电话或者长时间待机后,再回到应用也会出现崩溃的现象,而这些崩溃都与静态变量的空指针有关系。

如此来说的话,static静态修饰在Android的开发中是不是很危险?或许我们可以说如果是static User u = new User();这样定义的话,那么应该不会有太大问题,而如果是static User u;这样定义的话,那么很可以会出现NULL的现象。当然,前面的方法里面的属性也可能会现空的情况,但是这个可以用封装来避免空指针。另外静态常量还是很好用的。

那么应该如何保存登录或者全局的信息呢?根据Google官方的推荐以及百度到的各位大神的推荐,我们应该尽量使用继承自Application的自定义类,在我们继承的类中定义需要全局使用的变量,并通过getApplicationContext()来获取和保存相关的变量即可。

2.使用Application

/**

* 自定义的MyApplication继承Application

*

* @author way

*

*/ public class MyApplication extends Application {

/**

* 引发异常:在一些不规范的代码中经常看到Activity或者是Service当中定义许多静态成员属性。这样做可能会造成许多莫名其妙的 null pointer异常。

*/

/**

* 异常分析:Java虚拟机的垃圾回收机制会主动回收没有被引用的对象或属性。在内存不足时,虚拟机会主动回收处于后台的Activity或

* Service所占用的内存。当应用再次去调用静态属性或对象的时候,就会造成null pointer异常

*/

/**

* 解决异常:Application在整个应用中,只要进程存在,Application的静态成员变量就不会被回收,不会造成null pointer异常

*/

private int number;

@Override

public void onCreate() {

 // TODO Auto-generated method stub

 super.onCreate();

}

public int getNumber() {

 return number;

}

public void setNumber(int number) {

 this.number = number;

}

}1234567891011121314151617181920212223242526272829303132333435

不过,为了让我们的MyApplication取代android.app.Application的地位,在我们的代码中生效,我们需要修改AndroidManifest.xml:

application android:name=".MyApplication" ...

/application12

下面我们就可以在Activity或Service中灵活使用了:

MyApplication application = (MyApplication)this.getApplicationContext();  

//保存变量 application.setNumber(5);

//取出变量 application.getNumber();12345

而且按照Java及C#的种编辑思想的话,还是建议使用第二种试,这样对于系统的安全是好的!而且我查了一些资料显示,这样也是符合Android这种思想的,因此建议使用第二种方式,设置公共变量!

Application是与应用同时存在的,也就是应用在它就在,并不会被GC给莫名其妙的回收掉,因此,使用此方法更加安全。

阅读全文


当前文章:android的全局变量,android定义变量
链接分享:http://jkwzsj.com/article/dscsicc.html

其他资讯