application是维护全局状态的基类,android会在启动应用进程时创建一个application对象。application里面的对象变量是属于整个系统的。 在启动程序时会创建application对象,所以application对象诞生于其他任何对象之前,并且一直存活,直到应用进程结束。 默认情况下系统会为每个应用分配一个进程,进程的名称就是每个项目的包名,当进程启动的时候,系统会创建application对象,并调用对象的oncreate函数。 application在项目运行过程中不会改变,而activity在切换过程中,会有不断的创建和销毁,服务切换也是创建和销毁,但是application不会改变 application对象由android系统管理,其回调函数都运行于ui线程即主线程,
回调函数有oncreate,onconfigurationchanged即系统配置变更,包括屏幕方向变化,系统语言变化等,onlowmemory释放内存 application对象全局可访问,且全程陪同应用进程,适合共享全局状态,初始化全应用所需的服务。 静态单例也可以实现全局状态的共享
继承application类,并在androidmanifest.xml文件中的application下添加name属性,加上自定义的application类。
接下来以一个实例来展示application类的全局应用状态。
两张图片分别对应两个activity,myapplication类是application类的子类,在myapplication类中声明name变量,为其设置set和get方法。在activity1和activity2中获取myapplication的变量,并在activity1中设置name变量。
下面是myapplication的实现:
public class myapplication extends application { public static string name="ann"; public static string getname() { return name; } public static void setname(string name) { myapplication.name = name; } //application的创建,第一个创建,比activity中的oncreate方法调用还要早 @override public void oncreate() { super.oncreate(); toast.maketext(this, "application_oncreate"+this, toast.length_short).show(); } //监听系统变化的方法,如屏幕旋转,语言更改 @override public void onconfigurationchanged(configuration newconfig) { super.onconfigurationchanged(newconfig); } //回收内存 @override public void onlowmemory() { super.onlowmemory(); } }
activity1的实现:
public class activity1 extends appcompatactivity implements view.onclicklistener{ private button setname,getname,startactivity; @override protected void oncreate(@nullable bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); setname=(button)findviewbyid(r.id.setusername); getname=(button)findviewbyid(r.id.getusername); startactivity=(button)findviewbyid(r.id.startactivity); setname.setonclicklistener(this); getname.setonclicklistener(this); startactivity.setonclicklistener(this); } //当从activity2跳转到activity1时会调用这个方法,即activity1恢复 @override protected void onresume() { super.onresume(); toast.maketext(this, "activity1"+getapplication(), toast.length_short).show(); } //activity1到activity2时,activity1暂停状态 @override protected void onpause() { super.onpause(); toast.maketext(this, "activity2"+getapplication(), toast.length_short).show(); } @override public void onclick(view v) { switch (v.getid()){ case r.id.getusername: //获取application里变量的用法,注意强制类型转换,而且在androidmanifest文件中一定要添加name属性,否则运行失败 myapplication myapplication=(myapplication)getapplication(); //设置name之前获取的是原来的name,设置之后则获取之后的name string name=myapplication.getname(); toast.maketext(this, "getname--"+name, toast.length_short).show(); break; case r.id.setusername: myapplication myapplication1=(myapplication)getapplication(); myapplication1.setname("zhangsan"); toast.maketext(this, "setname"+myapplication1.getname(), toast.length_short).show(); break; case r.id.startactivity: startactivity(new intent(activity1.this,activity2.class)); break; } } }
activity2的实现:
public class activity2 extends appcompatactivity { private button getname; @override protected void oncreate(@nullable bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main2); getname=(button)findviewbyid(r.id.getusername2); getname.setonclicklistener(new view.onclicklistener() { @override public void onclick(view v) { myapplication myapplication=(myapplication)getapplication(); string name=myapplication.getname(); //获取的name和activity1中获取的name相同,说明application的对象是属于全局的。 toast.maketext(activity2.this, "getname:"+name, toast.length_short).show(); } }); } @override protected void onresume() { super.onresume(); toast.maketext(this, "activity2-"+getapplication(), toast.length_short).show(); } @override protected void onpause() { super.onpause(); toast.maketext(this, "activity2-"+getapplication(), toast.length_short).show(); } }
如对本文有疑问, 点击进行留言回复!!
Codeforces C. A Cookie for You (模拟 / 分类 / 贪心) (Round #654 Div.2)
DialogFragment弹窗(带黑色透明背景和不带黑色透明背景)
网友评论