学习andriod开发之 关于actvity(二)

       大家好 我是akira 是的 我又来了 前面刚讲完了文件存储 今天又跳到actvity2 是不是感觉有点奇怪呢 

咳咳 其实我自己也感觉比较怪(拍砖) 但实在是没想好 所以看前面坑着 还是从actvity开始讲吧 我估摸着应该会来个4部分 

我们从浅入深 一步一步来看 咳咳。

       好的 前面我们就说了下简单的actvity的写法 相比有些刚学andriod的朋友一定不满足吧 没错 哈哈 就像我刚开始那样 觉的怎么才这点东西 

上点干货才是正道!那我们先来点干货 再说点必须要说的 我们都知道 如果要想加载一个布局 关键的代码是setcontentView这里面传入的是一个

int 也就是布局的id

setContentView(R.layout.activity_main);

但是 如果我们打开源码 看其内部 发现它是这么一句代码

/**
     * Set the activity content from a layout resource.  The resource will be
     * inflated, adding all top-level views to the activity.
     *
     * @param layoutResID Resource ID to be inflated.
     * 
     * @see #setContentView(android.view.View)
     * @see #setContentView(android.view.View, android.view.ViewGroup.LayoutParams)
     */
    public void setContentView(int layoutResID) {
        getWindow().setContentView(layoutResID);
        initActionBar();
    }

布局上的注释就是其作用 这个我们讲过 其方法里有两个步骤 一个是拿到一个window再去setContentView 布局 还有一个是初始化actionBar

这里 我们接受到了一个新的名词叫做actionBar 什么是actionBar在现在来说你可以将其理解为一种title(标题)就像下图所示


好的 我们看下这个方法里具体都干了些什么

/**
     * Creates a new ActionBar, locates the inflated ActionBarView,
     * initializes the ActionBar with the view, and sets mActionBar.
     */
    private void initActionBar() {
        Window window = getWindow();

        // Initializing the window decor can change window feature flags.
        // Make sure that we have the correct set before performing the test below.
        window.getDecorView();

        if (isChild() || !window.hasFeature(Window.FEATURE_ACTION_BAR) || mActionBar != null) {
            return;
        }
        
        mActionBar = new ActionBarImpl(this);
        mActionBar.setDefaultDisplayHomeAsUpEnabled(mEnableDefaultActionBarUp);
    }


这里就是andriod actvity类中初始化actionBar的源码 我们可以清楚的看到 它先开始还是获得一个window

可见 我们的actvity跟window之间的关系紧密 然后 他调用了一个得到装饰的view 而这个方法是一个抽象的方法 

/**
     * Retrieve the top-level window decor view (containing the standard
     * window frame/decorations and the client's content inside of that), which
     * can be added as a window to the window manager.
     * 
     * <p><em>Note that calling this function for the first time "locks in"
     * various window characteristics as described in
     * {@link #setContentView(View, android.view.ViewGroup.LayoutParams)}.</em></p>
     * 
     * @return Returns the top-level window decor view.
     */
    public abstract View getDecorView();

直说了返回一个顶端的装饰的view 知道这个之后 我们继续看 下面是一个逻辑判断 我们忽略掉 

下行是new了一个actBar的实现类  然后调了一个很长的方法 setDefaultDisplayHomeAsUpEnabled 不过你从enable也能看出来 参数无非是传true还是false

果然从这里得到了验证

private boolean mEnableDefaultActionBarUp;
这里咱不看别的 default相比你已经有了结果 

关于actionBar的其他设置 咱以后再讲 扯回来发现真正加载布局的时候是getWindow.xxx这么加载的 而这个方法又是一个抽象方法 

/**
     * Convenience for
     * {@link #setContentView(View, android.view.ViewGroup.LayoutParams)}
     * to set the screen content from a layout resource.  The resource will be
     * inflated, adding all top-level views to the screen.
     *
     * @param layoutResID Resource ID to be inflated.
     * @see #setContentView(View, android.view.ViewGroup.LayoutParams)
     */
    public abstract void setContentView(int layoutResID);


这里有一道面试题是问 actvity window 和view 的关系 这里我们既然看完了一点源码相比回答起来应该so easy 

这里我认为actvity 是一个媒介 而真正起作用的是window 它加载一个view 

(PS 这道面试题网上有很多答案 而太多的答案千篇一律如果给面试官 会使其有一种你在背答案的感觉 面试个人认为是答出个人的看法 如有争议正好留有讨论的余地)

为什么我一定可以确定它就是加载的view 因为源码中还存在这样的方法

/**
     * Set the activity content to an explicit view.  This view is placed
     * directly into the activity's view hierarchy.  It can itself be a complex
     * view hierarchy.  When calling this method, the layout parameters of the
     * specified view are ignored.  Both the width and the height of the view are
     * set by default to {@link ViewGroup.LayoutParams#MATCH_PARENT}. To use
     * your own layout parameters, invoke
     * {@link #setContentView(android.view.View, android.view.ViewGroup.LayoutParams)}
     * instead.
     * 
     * @param view The desired content to display.
     *
     * @see #setContentView(int)
     * @see #setContentView(android.view.View, android.view.ViewGroup.LayoutParams)
     */
    public void setContentView(View view) {
        getWindow().setContentView(view);
        initActionBar();
    }

    /**
     * Set the activity content to an explicit view.  This view is placed
     * directly into the activity's view hierarchy.  It can itself be a complex
     * view hierarchy.
     * 
     * @param view The desired content to display.
     * @param params Layout parameters for the view.
     *
     * @see #setContentView(android.view.View)
     * @see #setContentView(int)
     */
    public void setContentView(View view, ViewGroup.LayoutParams params) {
        getWindow().setContentView(view, params);
        initActionBar();
    }

二者区别之前无非是加了个布局参数罢了 

好的 整个加载布局我们先告一段落 我们发现 我们在写actvity的时候 特别是eclipse生成的时候 它会将你加载的布局放到onCreate中 而且自动生成 

同样的 onXXX方法还有很多 这些方法又是干什么的呢 这个就涉及到了actvity的生命周期

学过web的哥们应该知道 servlet有生命周期 它就跟人一样 生老病死 同样我们的actvity也有自己的生命周期 后期还要接触fragment 

这哥们也有自己的生命周期 我们拿一幅图来说下


这张图实在是太经典了 act开始 onC onS onR 分别为创造 开始 得到焦点 这时actvity就算是真正的跑起来 图上说

actvity running 然后 上面写的很清楚 另一个act来的时候 先暂停 onP pause (如不再显示)onStop onD 销毁

如果Stop过程中 进程被干 那么就重新create  否则还在的话 前面那个act回来 会调用onRestart onS onR再来一遍 

这里有道面试题是问 如果是窗口话的act 什么方法没有调用 我们从图里显然看出 是onStop

也就是下面这些话

1.启动Activity:系统会先调用onCreate方法,然后调用onStart方法,最后调用onResume,Activity进入运行状态。

2.当前Activity被其他Activity覆盖其上或被锁屏:系统会调用onPause方法,暂停当前Activity的执行。

3.当前Activity由被覆盖状态回到前台或解锁屏:系统会调用onResume方法,再次进入运行状态。

4.当前Activity转到新的Activity界面或按Home键回到主屏,自身退居后台:系统会先调用onPause方法,然后调用onStop方法,进入停滞状态。

5.用户后退回到此Activity:系统会先调用onRestart方法,然后调用onStart方法,最后调用onResume方法,再次进入运行状态。

6.当前Activity处于被覆盖状态或者后台不可见状态,即第2步和第4步,系统内存不足,杀死当前Activity,而后用户退回当前Activity:再次调用onCreate方法、onStart方法、onResume方法,进入运行状态。

7.用户退出当前Activity:系统先调用onPause方法,然后调用onStop方法,最后调用onDestory方法,结束当前Activity。

上面七局转用 http://blog.csdn.net/liuhe688/article/details/6733407 的文章 但我觉得太繁琐 如果各位真正理解了那幅图 

我想 这周期就可以万变不离其宗了

       说完了生命周期 我们来说说下一个话题 就是启动模式 actvity有四种启动模式 

这个开发过andriod的哥们都知道 没有了解的 我也可以给各位说下 standar singleTop singleTask singleIntance

至于这几种模式 我有我个人的理解 

因为我们要明白一点 andriod系统管理act栈的话是先进后出的 这里出现了栈 就有压栈和弹栈的概念 

这两点不清楚的 可以百度下 因为实在没什么可说的 而我们知道 管理act其实是有一个叫做activitiyManager 的这么一个类

而 标准就很简单 就是默认 前面说过 

    singleTop 也很简单 当两个AA都在栈顶时 只保留一个 

   SINGLETask 跟其类似 当两个A在栈时 保留一个 

  singleIntance 就有点像电影荒岛余生的感觉 只要有一个联系了 另外一个肯定是要断的 而且加入a是singleIntance模式 

那么这一个栈都是它的 叫做我的地盘我做主 

现在 各位已经了解了不少 但是有一个核心的问题就是其通讯 我们知道 做应用 数据肯定是要交流的 

那么如何交流 下次我们继续讲解 

学习andriod开发之 关于actvity(三)

风景图一张



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值