Android onCreate 实例详解
在androidmanifest.xml文件中的 intent-filter 元素中有这么两句:
当写好的应用发布到手机上之后,当双击”抽屉“里该应用的图标时,会将这个点击事件包装成一个intent,该intent包含两个参数,如上所述的两个参数action, category
被传递给应用之后,在应用的功能清单文件中寻找与该意图匹配的意图过滤器,如果匹配成功,找到相匹配的意图过滤器所在的activity元素,再根据
activity 元素的”name“属性来寻找其对应的activity类。接着android操作系统创建该activity类的实例对象,对象创建完成之后,会执行到该类的oncreate方法,
此oncreate方法是重写父类activity的oncreate方法而实现的。oncreate方法用来初始化activity实例对象。如下是androiduidemo.java类中的oncreate方法的代码:
@override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.caculator_layout); log.d(tag,"debug"); log.i(tag,"info"); log.w(tag,"warm"); log.e(tag,"error"); log.v(tag,"verbose"); //找控件 initview(); //设置点击事件 initclickevent(); }
一、 super.oncreate(savedinstancestate)
其中super.oncreate(savedinstancestate)的作用是调用其父类activity的oncreate方法来实现对界面的图画绘制工作。
在实现自己定义的activity子类的oncreate方法时一定要记得调用该方法,以确保能够绘制界面。
super.oncreate主要是加载一些。
第一件事情便是super.oncreate(savedinstancestate),其实这条语句放在子类中的oncreate方法中的任何位置都可,问题只是
super.oncreate(savedinstancestate)必须要被执行,所以,最好也就是放在第一行,看起来比较明确。
在targetactivity中重写了oncreate方法,而在activity中的oncreate方法中已经对一些基本的基础进行了操作,如果子类没有super.oncraete方法的调用,会导致子类中的oncreate方法功能不全,从而出现错误。
savedinstancestate
在activity的生命周期中,只要离开了可见阶段,或者说失去了焦点,activity就很可能被进程终止了!,被kill掉了,,这时候,就需要有种机制,能保存当时的状态,这就是savedinstancestate的作用。
当一个activity在pause时,被kill之前,它可以调用
onsaveinstancestate()来保存当前activity的状态信息(在paused状态时,要被killed的时候)。用来保存状态信息的bundle会同时传给两个method,即onrestoreinstancestate() and oncreate().
二、setcontentview(r.layout.caculator_layout)
作用:加载一个界面。
该方法中传入的参数是”r.layout.caculator_layout“,其含义为r.java类中静态内部类layout的静态常量caculator_layout的值,
而该值是一个指向res目录下的layout子目录下的caculator_layout.xml文件的标识符。因此代表着显示caculator_layout.xml所定义的画面。
三、两种点击事件
/* *设置点击事件 */ private void initclickevent(){ //第一种设置方式 mcancel.setonclicklistener(new view.onclicklistener() { public void onclick(view v) { log.d(tag, "content=="+((textview)v).gettext() ); } }); //第二种设置方式 mplusorminus.setonclicklistener(this); mplus.setonclicklistener(this); } @override public void onclick(view v) { //如果有多个空间设置点击事件,我们这里需要统一处理的话,需要判断是 //哪一个控件 if(v == mplusorminus){ log.d(tag, "点击了mplusorminus" + ((textview)v).gettext().tostring()); }else if(v == mplus){ //同样的方式去判断 } //另一种方式及时用switch来判断id //先拿到id int id = v.getid(); switch(id){ case r.id.tv_number_one: //one这个内容被点击了,就在这里处理 break; case r.id.tv_equal: //处理等号事件 break; } }
控件初始化
/* *在这里找到控件 */ private void initview() { mcancel = (textview) this.findviewbyid(r.id.tv_cancel); mplusorminus = (textview) this.findviewbyid(r.id.tv_plus_or_minus); mmod = (textview) this.findviewbyid(r.id.tv_mod); mdivider = (textview) this.findviewbyid(r.id.tv_pider); mone = (textview) this.findviewbyid(r.id.tv_number_one); mtwo = (textview) this.findviewbyid(r.id.tv_number_two); mthree = (textview) this.findviewbyid(r.id.tv_number_three); mtime = (textview) this.findviewbyid(r.id.tv_time); mfour = (textview) this.findviewbyid(r.id.tv_number_four); mfive = (textview) this.findviewbyid(r.id.tv_number_five); msix = (textview) this.findviewbyid(r.id.tv_number_six); mminus = (textview) this.findviewbyid(r.id.tv_minus); mseven = (textview) this.findviewbyid(r.id.tv_number_seven); meight = (textview) this.findviewbyid(r.id.tv_number_eight); mnine = (textview) this.findviewbyid(r.id.tv_number_nine); mplus = (textview) this.findviewbyid(r.id.tv_plus); mzero = (textview) this.findviewbyid(r.id.tv_number_zero); }