中易网

在Android开发中怎样使用Application类

答案:2  悬赏:0  
解决时间 2021-02-19 07:15
在Android开发中怎样使用Application类
最佳答案
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中值就会改变。
全部回答
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中的任何一个方法时,就会出现空指针异常,上面的代码就是这种情况。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
修眉刀都是一次性的吗?
刚装培养基的培养皿要不要叠起来
每年正常体检做msct辐射大吗
请稍等,正在验证客户端环境............
麻烦问哈蜀山传有第2部吗?
绝味鸭脖何家营店在什么地方啊,我要过去处理
中压猛火炉不需要那么大火,可以用低压阀门吗
问: 朋友欠我钱1000多。他总是找理由说过
在国家危难之时,是这样的一个女孩站了出来。
森泰房地产开发公司在哪里啊,我有事要去这个
我的罗汉都13厘米长了还能起头吗?
求定积分∫(0,1)√(1-x^2)dx啊,答案是1pa
盐水能让竹子不长叶子是吗?
爱车堂汽车美容装潢太原旗舰店在什么地方啊,
油中香料的味道怎么样才能保存?
推荐资讯
说话卡壳经常控制不住自己,怎样调整这种状态
爱尚学习文体生活馆在哪里啊,我有事要去这个
新华书店宽甸分店地址有知道的么?有点事想过
振鑫汽车修理厂这个地址在什么地方,我要处理
一些名牌的黄金首饰比如周大福 周生生老凤祥
三轮摩托车发动机旁边一踩就倒车那个好多钱
红米手机显示SIM卡,点拨号和联系人闪退,SIM
2016年12月没有准考证号怎么查六级成绩
sql 交叉查询 字段名年份为什么不能用阿拉伯
买经典轩逸手动好还是自动好?轩逸论坛
黑芝麻如何辨别真假
公能西路/月异道(路口)在哪里啊,我有事要去
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?