欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android onCreate 实例详解

程序员文章站 2022-05-21 16:23:26
在androidmanifest.xml文件中的 intent-filter 元素中有这么两句:...

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);
    }