在Android开发中怎样使用Application类
答案:2 悬赏:0
解决时间 2021-02-19 07:15
- 提问者网友:朱砂泪
- 2021-02-19 00:27
在Android开发中怎样使用Application类
最佳答案
- 二级知识专家网友:怪咖小青年
- 2021-02-19 01:20
1、Application和Activity,Service一样是Android框架的一个系统组件,当Android程序启动时系统会创建一个Application对象,用来存储系统的一些信息。
2、Android系统自动会为每个程序运行时创建一个Application类的对象且只创建一个,所以Application可以说是单例(singleton)模式的一个类。
3、通常我们是不需要指定一个Application的,系统会自动帮我们创建,如果需要创建自己的Application,那也很简单!创建一个类继承Application并在AndroidManifest.xml文件中的application标签中进行注册(只需要给application标签增加name属性,并添加自己的 Application的名字即可)。
4、启动Application时,系统会创建一个PID,即进程ID,所有的Activity都会在此进程上运行。那么我们在Application创建的时候初始化全局变量,同一个应用的所有Activity都可以取到这些全局变量的值,换句话说,我们在某一个Activity中改变了这些全局变量的值,那么在同一个应用的其他Activity中值就会改变。
2、Android系统自动会为每个程序运行时创建一个Application类的对象且只创建一个,所以Application可以说是单例(singleton)模式的一个类。
3、通常我们是不需要指定一个Application的,系统会自动帮我们创建,如果需要创建自己的Application,那也很简单!创建一个类继承Application并在AndroidManifest.xml文件中的application标签中进行注册(只需要给application标签增加name属性,并添加自己的 Application的名字即可)。
4、启动Application时,系统会创建一个PID,即进程ID,所有的Activity都会在此进程上运行。那么我们在Application创建的时候初始化全局变量,同一个应用的所有Activity都可以取到这些全局变量的值,换句话说,我们在某一个Activity中改变了这些全局变量的值,那么在同一个应用的其他Activity中值就会改变。
全部回答
- 1楼网友:萝莉姐姐鹿小北
- 2021-02-19 01:57
1. context类型
android是用java语言来编写和,然而android却需要一个完整的android工程环境,在这个环境下,我们熟悉的activity、service、contentprivoder等系统组件才能有自己各自的上下文环境,也就是context。context是维持android应用的核心功能类,是整个android系统交互的核心。
context的继承结构从图中可以看到,直系子类有两个,一个是contextwrapper,一个是contextimpl。那么从名字上就可以看出,contextwrapper是上下文功能的封装类,而contextimpl则是上下文功能的实现类。而contextwrapper又有三个直接的子类,contextthemewrapper、service和application。其中,contextthemewrapper是一个带主题的封装类,而它有一个直接子类就是activity。
在这里我们至少看到了几个所比较熟悉的面孔,activity、service、还有application。由此,其实我们就已经可以得出结论了,context一共有三种类型,分别是application、activity和service。这三个类虽然分别各种承担着不同的作用,但它们都属于context的一种,而它们具体context的功能则是由contextimpl类去实现的。
一种比较特殊的情况是dialog要求在activity的context中弹出,而一些全局的例如网络终端的dialog需要什么特殊权限。
2. application类在项目开发中的使用
首先在项目目录下一个java类继承application类,实现是oncreate()方法。这个类可以做app的全局初始化工作,比如图片加载框架的全局配置信息设置。
public class androidapplication extends application {
private static androidapplication instance;
@override
public void oncreate() {
super.oncreate();
instance = this;
}
public static androidapplication getinstance(){
return instance;
}
}
然后千万不要忘了在android项目的manifest文件中指定application的实现类,不然系统会创建一个默认的application类。
3. application类或context类的误用情况
1. 用application缓存数据
因为application会因为进入background后内存不足被系统干掉,进入后系统会重现创建一个application类,而导致缓存在application类里的数据全部初始化而丢失。
2. 错误的获取全局context对象的方式
public class anddroidapplication extends application {
private static anddroidapplication app;
public static anddroidapplication getinstance() {
if (app == null) {
app = new myapplication();
}
return app;
}
}
上面这种方式如果是单纯的java工程可能没有问题,但是在android里这样说大错特错的。因为application是系统组件,系统组件实例是要由系统去创建的,如果我们这里直接创建一个,不过是简单的java对象而已,不具备任何context能力,也无法进行任何context操作。标准的写法就本文的第一段示意代码那样。
3. 在控件的构造方法中获取context或者做其他视图操作
写过android的同学应该知道自己或者看别人dome都很少或者基本看不到在控件构造函数内进行初始化,获取参数等这些操作吧!是的,这样做是很容易出难以发现的bug的。具体原因是在contextwrapper类的源码中,他有一个attachbasecontext()方法,这个方法会将传入的一个context参数赋值给mbase对象,之后mbase对象就有值了。而我们又知道,所有context的方法都是调用这个mbase对象的同名方法,那么也就是说如果在mbase对象还没赋值的情况下就去调用context中的任何一个方法时,就会出现空指针异常,上面的代码就是这种情况。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯
• 手机登qq时,显示手机磁盘不足,清理后重新登 |
• 刺客的套装怎么选啊? |