http://blog.csdn.net/lz99770337/article/details/46890239

来源:互联网 发布:sql如何使用 编辑:程序博客网 时间:2024/06/05 07:57
<div id="main">
                <div class="main">
                        <div class="ad_class">
<div class="notice tracking-ad" data-mod="popu_3"> 




<a href="http://bss.csdn.net/m/topic/community_IoT/index" target="_blank">
<font color="blue"><strong>【CSDN 技术主题月】物联网全栈开发</strong></font></a>


&nbsp;&nbsp;&nbsp;&nbsp;


<a href=" http://blog.csdn.net/turingbooks/article/details/72416875" target="_blank">
<font color="red"><strong>【评论送书】5月书讯:流畅的Python </strong></font></a>
&nbsp;&nbsp;&nbsp;&nbsp;


<a href="http://blog.csdn.net/blogdevteam/article/details/72844981" target="_blank">
<font color="blue"><strong>CSDN日报20170602 ——《程序员、技术主管和架构师》
</strong></font></a>


&nbsp;&nbsp;&nbsp;&nbsp;


<a href=" http://powerai.csdn.net/finance" target="_blank">
<font color="red"><strong>IBM PowerAI人工智能马拉</strong></font></a>




</div>                        </div>
                        






  












<script type="text/javascript" src="http://static.blog.csdn.net/scripts/category.js"></script>


  <script type="text/ecmascript">
      window.quickReplyflag = true;
           
            var isBole = false;
            
      
      var fasrc="http://my.csdn.net/my/favorite/miniadd?t=SystemUI%e6%ba%90%e7%a0%81%e5%88%86%e6%9e%90&u=http://blog.csdn.net/lz99770337/article/details/46890239"


    </script>
<div id="article_details" class="details">
    <div class="article_title">   
         <span class="ico ico_type_Original"></span>




    <h1>
        <span class="link_title"><a href="/lz99770337/article/details/46890239">
        SystemUI源码分析            
        </a></span>
    </h1>
</div>


   


        <div class="article_manage clearfix">
        <div class="article_l">
            <span class="link_categories">
            标签:
              <a href="http://www.csdn.net/tag/android%e5%bc%80%e5%8f%91" target="_blank" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">android开发</a>
            </span>
        </div>
        <div class="article_r">
            <span class="link_postdate">2015-07-15 11:03</span>
            <span class="link_view" title="阅读次数">4007人阅读</span>
            <span class="link_comments" title="评论次数"> <a href="#comments" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_pinglun'])">评论</a>(4)</span>
            <span class="link_collect tracking-ad" data-mod="popu_171"> <a href="javascript:void(0);" onclick="javascript:collectArticle('SystemUI%e6%ba%90%e7%a0%81%e5%88%86%e6%9e%90','46890239');return false;" title="收藏" target="_blank">收藏</a></span>
             <span class="link_report"> <a href="#report" onclick="javascript:report(46890239,2);return false;" title="举报">举报</a></span>


        </div>
    </div>
    <div class="embody" style="display:none" id="embody">
        <span class="embody_t">本文章已收录于:</span>
        <div class="embody_c" id="lib" value="{&quot;err&quot;:0,&quot;msg&quot;:&quot;ok&quot;,&quot;data&quot;:[]}"></div>
    </div>
    <style type="text/css">        
            .embody{
                padding:10px 10px 10px;
                margin:0 -20px;
                border-bottom:solid 1px #ededed;                
            }
            .embody_b{
                margin:0 ;
                padding:10px 0;
            }
            .embody .embody_t,.embody .embody_c{
                display: inline-block;
                margin-right:10px;
            }
            .embody_t{
                font-size: 12px;
                color:#999;
            }
            .embody_c{
                font-size: 12px;
            }
            .embody_c img,.embody_c em{
                display: inline-block;
                vertical-align: middle;               
            }
             .embody_c img{               
                width:30px;
                height:30px;
            }
            .embody_c em{
                margin: 0 20px 0 10px;
                color:#333;
                font-style: normal;
            }
    </style>
    <script type="text/javascript">
        $(function () {
            try
            {
                var lib = eval("("+$("#lib").attr("value")+")");
                var html = "";
                if (lib.err == 0) {
                    $.each(lib.data, function (i) {
                        var obj = lib.data[i];
                        //html += '<img src="' + obj.logo + '"/>' + obj.name + "&nbsp;&nbsp;";
                        html += ' <a href="' + obj.url + '" target="_blank">';
                        html += ' <img src="' + obj.logo + '">';
                        html += ' <em><b>' + obj.name + '</b></em>';
                        html += ' </a>';
                    });
                    if (html != "") {
                        setTimeout(function () {
                            $("#lib").html(html);                      
                            $("#embody").show();
                        }, 100);
                    }
                }      
            } catch (err)
            { }
            
        });
    </script>
      <div class="category clearfix">
        <div class="category_l">
           <img src="http://static.blog.csdn.net/images/category_icon.jpg">
            <span>分类:</span>
        </div>
        <div class="category_r">
                    <label onclick="GetCategoryArticles('5649201','lz99770337','top','46890239');">
                        <span onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_fenlei']);">Android<em>(18)</em></span>
                      <img class="arrow-down" src="http://static.blog.csdn.net/images/arrow_triangle _down.jpg" style="display:inline;">
                      <img class="arrow-up" src="http://static.blog.csdn.net/images/arrow_triangle_up.jpg" style="display:none;">
                        <div class="subItem">
                            <div class="subItem_t"><a href="http://blog.csdn.net/lz99770337/article/category/5649201" target="_blank">作者同类文章</a><i class="J_close">X</i></div>
                            <ul class="subItem_l" id="top_5649201">                            
                            </ul>
                        </div>
                    </label>                    
        </div>
    </div>
        <div class="bog_copyright">         
            <p class="copyright_p">版权声明:本文为博主原创文章,未经博主允许不得转载。</p>
        </div>


  


  
  
     




<div id="article_content" class="article_content tracking-ad" data-mod="popu_307" data-dsm="post">
        <div class="markdown_views"><p>此篇文章针对android5.1 systemUI源码进行分析</p>


<p>下面我们进行分析, <br>
1.1  frameworks/base/packages/SystemUI/AndroidManifest.xml <br>
        我们先来看下这个文件下的内容: <br>
        <a href="http://lib.csdn.net/base/android" class="replace_word" title="Android知识库" target="_blank" style="color:#df3434; font-weight:bold;">Android</a>:name=”.SystemUIApplication” <br>
        android:persistent=”true” <br>
        android:allowClearUserData=”false” <br>
        android:allowBackup=”false” <br>
        android:hardwareAccelerated=”true” <br>
        android:label=”@string/app_label” <br>
        android:icon=”@drawable/icon” <br>
        android:process=”com.android.systemui” <br>
        android:supportsRtl=”true” <br>
        android:theme=”@style/systemui_theme”&gt; <br>
       ……………………………………… <br>
            android:exported=”true” <br>
            /&gt; <br>
            android:process=”:screenshot” <br>
            android:exported=”false” /&gt; <br>
           android:exported=”true” /&gt; <br>
            android:permission=”android.permission.BIND_WALLPAPER” <br>
                android:exported=”true” /&gt; <br>
       ……………………………………… <br>
       ……………………………………… <br>
       ………………………………………</p>


<pre><code> 我们可以看到,AndroidManifest.xml注册了很多的service 和 广播,那么是怎么启动的服务呢?
    我们继续看下这个所注册的三个服务,
               SystemUIService /
               .screenshot.TakeScreenshotService /
              .LoadAverageService/.ImageWallpaper
</code></pre>


<p>这三个服务是怎么启动的呢,我们仔细来看下这句注释: <br>
                  “Broadcast receiver that gets the broadcast at boot time and starts up everything else.” <br>
看里这个注释,我们就应该知道,首先启动的应该是SystemUIService这个服务。 <br>
          那么SystemUIService这个服务是怎么启动的呢,启动服务我们知道多数的通用方法是 <br>
          startService(intent)和bindService(intent) <br>
那么我们就在SystemUI下全局搜索“SystemUIService”,可以看下结果 <br>
    frameworks/base/services/<a href="http://lib.csdn.net/base/java" class="replace_word" title="Java 知识库" target="_blank" style="color:#df3434; font-weight:bold;">Java</a>/com/android/server/SystemServer.java:                   “com.android.systemui.SystemUIService”)); <br>
我们打开SystemServer.java这个文件来看下是怎么调用的,</p>


<p>static final void startSystemUi(Context context) { <br>
        Intent intent = new Intent(); <br>
        intent.setComponent(new ComponentName(“com.android.systemui”, <br>
                    “com.android.systemui.SystemUIService”)); <br>
        //Slog.d(TAG, “Starting service: ” + intent); <br>
        context.startServiceAsUser(intent, UserHandle.OWNER); <br>
    }</p>


<p>原来是 intent.setComponent()启动了SystemUIService这个服务。</p>


<p>1.2 frameworks/base/packages/SystemUI/src/com/android/systemui/SystemUIService.java  </p>


<p>下面我们来分析一下SystemUIService.java:</p>






<pre class="prettyprint" name="code"><code class="hljs java has-numbering"><span class="hljs-annotation">@Override</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCreate</span>() {
        <span class="hljs-keyword">super</span>.onCreate();
        ((SystemUIApplication) getApplication()).startServicesIfNeeded();
    }</code><ul class="pre-numbering" style="opacity: 0;"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li></ul></pre>


<p>在oSystemUIService中的onCreate只调用了 <br>
((SystemUIApplication) getApplication()).startServicesIfNeeded(); <br>
这么一个语句,下面我们来看看startServicesIfNeeded()这里面有啥东西</p>


<pre><code>public void startServicesIfNeeded() {        
    if (mServicesStarted) {         
        return;
    }                               
    if (!mBootCompleted) {          
        // check to see if maybe it was already completed long before we began
        // see ActivityManagerService.finishBooting()
        if ("1".equals(SystemProperties.get("sys.boot_completed"))) { 
            mBootCompleted = true;  
            if (DEBUG) Log.v(TAG, "BOOT_COMPLETED was already sent");        
        }
    }


    Log.v(TAG, "Starting SystemUI services.");
    final int N = SERVICES.length;  
    for (int i=0; i&lt;N; i++) {       
        Class&lt;?&gt; cl = SERVICES[i];  
        if (DEBUG) Log.d(TAG, "loading: " + cl); 
        try {
            mServices[i] = (SystemUI)cl.newInstance();
        } catch (IllegalAccessException ex) {        
            throw new RuntimeException(ex);      
        } catch (InstantiationException ex) {        
            throw new RuntimeException(ex);      
        }
        mServices[i].mContext = this;            
        mServices[i].mComponents = mComponents;  
        if (DEBUG) Log.d(TAG, "running: " + mServices[i]);
        mServices[i].start();


        if (mBootCompleted) {
            mServices[i].onBootCompleted();      
        }
    }
    mServicesStarted = true;
}
</code></pre>


<p>}</p>


<p>在这里我们看到mServices启动了不止一个服务,那么这些都是那些服务呢, <br>
我们看这个语句 <br>
    mServices[i] = (SystemUI)cl.newInstance(); <br>
这里的语句付给了mServices[i].start()一个对象, <br>
我们往上去找,可以看到这Class cl = SERVICES[i]; <br>
cl是SERVICES[i]这个数组中的一个值,在java的定义中,我们可以看到这个SERVICES的初始化 <br>
    private final Class[] SERVICES = new Class[] { <br>
           com.android.systemui.keyguard.KeyguardViewMediator.class, <br>
           com.android.systemui.recent.Recents.class, <br>
            com.android.systemui.volume.VolumeUI.class, <br>
            com.android.systemui.statusbar.SystemBars.class, <br>
            com.android.systemui.usb.StorageNotification.class, <br>
            com.android.systemui.power.PowerUI.class, <br>
           com.android.systemui.media.RingtonePlayer.class <br>
   }; <br>
SERVICES中添加要start的所有服务选项,这里,我们重点关注一下 <br>
    com.android.systemui.statusbar.SystemBars.class, <br>
这是我们进行下一步分析的重要线索。</p>


<p>1.3 frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/SystemBars.java</p>


<p>我们看下SystemBars.java这个文件中的start()中到底写了些什么东西,</p>


<pre><code>public void start() {
    if (DEBUG) Log.d(TAG, "start");
    mServiceMonitor = new ServiceMonitor(TAG, DEBUG,
            mContext, Settings.Secure.BAR_SERVICE_COMPONENT, this);
    mServiceMonitor.start();  // will call onNoService if no remote service is found
}   
</code></pre>


<p>这里,启动了另外一个服务mServiceMonitor,除了启动这个服务外什么都没有做,那我们继续往下面去看看 <br>
 frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/ServiceMonitor.java <br>
在这个文件里面,对star()方法的调用 <br>
    public void start() { <br>
        ………………… <br>
        mHandler.sendEmptyMessage(MSG_START_SERVICE); <br>
    } <br>
 在这个函数里,这个sendEmptyMessage语句是一个非常关键的调用,这个调用也是启动了一个服务,我们去看下这个mHandler都干了些啥事,</p>


<p>private final Handler mHandler = new Handler() { <br>
        public void handleMessage(Message msg) { <br>
            switch(msg.what) { <br>
                case MSG_START_SERVICE: <br>
                    startService(); <br>
                    break; <br>
                case MSG_CONTINUE_START_SERVICE: <br>
                    continueStartService(); <br>
                    break; <br>
                case MSG_STOP_SERVICE: <br>
                    stopService(); <br>
                    break; <br>
                case MSG_PACKAGE_INTENT: <br>
                    packageIntent((Intent)msg.obj); <br>
                    break; <br>
                case MSG_CHECK_BOUND: <br>
                    checkBound(); <br>
                    break; <br>
                case MSG_SERVICE_DISCONNECTED: <br>
                    serviceDisconnected((ComponentName)msg.obj); <br>
                    break; <br>
            } <br>
        } <br>
    };</p>


<p>在这里我们看到 <br>
     case MSG_START_SERVICE: <br>
                    startService(); <br>
                    break; <br>
 这里才是真正的启动了一个服务,mCallbacks.onNoService(); <br>
    private void startService() { <br>
        mServiceName = getComponentNameFromSetting(); <br>
        if (mDebug) Log.d(mTag, “startService mServiceName=” + mServiceName); <br>
        if (mServiceName == null) { <br>
            mBound = false; <br>
            mCallbacks.onNoService(); <br>
        } else { <br>
            long delay = mCallbacks.onServiceStartAttempt(); <br>
            mHandler.sendEmptyMessageDelayed(MSG_CONTINUE_START_SERVICE, delay); <br>
        } <br>
    } <br>
    我们来看下if (mServiceName == null) 这个判断的结果是怎么来的, <br>
private ComponentName getComponentNameFromSetting() { <br>
        String cn = Settings.Secure.getStringForUser(mContext.getContentResolver(), <br>
                mSettingKey, UserHandle.USER_CURRENT); <br>
        return cn == null ? null : ComponentName.unflattenFromString(cn); <br>
    } <br>
由以上的代码我们可知,cn返回的是null值,在startService()中就调用了 mCallbacks.onNoService();</p>


<p>我们来看下frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/SystemBars.java <br>
           onNoService()的调用,</p>


<p>public void onNoService() { <br>
        if (DEBUG) Log.d(TAG, “onNoService”); <br>
        createStatusBarFromConfig(); <br>
    }</p>


<p>private void createStatusBarFromConfig() { <br>
        ………………………………….. <br>
        mStatusBar.mContext = mContext; <br>
        mStatusBar.mComponents = mComponents; <br>
        mStatusBar.start(); <br>
    ………………………………….. <br>
    } <br>
在createStatusBarFromConfig()中终于有了实际的行动来进行关于status的一下相关操作了,一直到这里,其实前面所做的都是一些服务的调用,并没有对screen进行任何的view类级别的操作,其实上面的流程,只是在系统框架先进行的一些服务注册,及逻辑方面的一些准备。</p>


<p>1.4  frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java <br>
 下面我们来着重分析下BaseStatusBar.start().</p>


<p>public void start() { <br>
     ……………………. <br>
     createAndAddWindows(); <br>
     ……………………. <br>
  } <br>
 在BaseStatusBar.start()中,这个语句是重点中的重点,是对整个status的布局,我们进到这个函数中去看个究竟 <br>
frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java <br>
    public void createAndAddWindows() { <br>
        addStatusBarWindow(); <br>
    } <br>
在createAndAddWindows中也只是调用了这么一个函数,没有其他的东西了,我们接着看 <br>
addStatusBarWindow(); <br>
其实在addStatusBarWindow所做的东西也不多,就是两步 <br>
makeStatusBarView()和mStatusBarWindowManager.add(); <br>
但是这两步确实非常重要的两部。 <br>
private void addStatusBarWindow() { <br>
    makeStatusBarView(); <br>
    mStatusBarWindowManager = new StatusBarWindowManager(mContext); <br>
    mStatusBarWindowManager.add(mStatusBarWindow, getStatusBarHeight()); <br>
 }</p>


<p>我们先来看看akeStatusBarView()这个里面是什么情况 <br>
protected PhoneStatusBarView makeStatusBarView() { <br>
    ………………………… <br>
mStatusBarWindow = (StatusBarWindowView) View.inflate(context,R.layout.super_status_bar, null); <br>
    …………………………..</p>


<p>}</p>


<p>我们在super_status_bar.xml中这个文件可以看到 <br>
&lt;-com.android.systemui.statusbar.phone.StatusBarWindowView <br>
    //xmlns:android=”http://schemas.android.com/apk/res/android” <br>
    android:layout_width=”match_parent” <br>
    android:layout_height=”match_parent” <br>
    android:fitsSystemWindows=”true”&gt; <br>
 ………………………….. <br>
    &lt;-com.android.systemui.statusbar.ScrimView android:id=”@+id/scrim_behind” <br>
        android:layout_width=”match_parent” <br>
        android:layout_height=”match_parent” <br>
        android:importantForAccessibility=”no” /&gt;</p>


<pre><code>&lt;include layout="@layout/status_bar"
    android:layout_width="match_parent"
    android:layout_height="@dimen/status_bar_height" /&gt;
</code></pre>


<p>…………………………………… <br>
    &lt;-com.android.systemui.statusbar.phone.PanelHolder <br>
        android:id=”@+id/panel_holder” <br>
        android:layout_width=”match_parent” <br>
        android:layout_height=”match_parent” <br>
        android:background=”@color/transparent” &gt; <br>
        &lt;-include layout=”@layout/status_bar_expanded” <br>
            android:layout_width=”match_parent” <br>
            android:layout_height=”match_parent” <br>
            android:visibility=”gone” /&gt; <br>
    &lt;-/com.android.systemui.statusbar.phone.PanelHolder&gt; <br>
在这里,我们主要注意上面所示status_bar / panel_holder才是我们要关注的重中之重,是我们整个view的最直观的显示,也是客户化定制比较多的地方,下面我们来进行进一步的细分。</p>


<p>1.5  frameworks/base/packages/SystemUI/res/layout/status_bar.xml</p>


<p>&lt;-com.android.systemui.statusbar.phone.PhoneStatusBarView <br>
 23     xmlns:android=”http://schemas.android.com/apk/res/android” <br>
 24     xmlns:systemui=”http://schemas.android.com/apk/res/com.android.systemui” <br>
 25     android:id=”@+id/status_bar” <br>
 26     android:background=”@drawable/system_bar_background” <br>
 27     android:orientation=”vertical” <br>
 28     android:focusable=”true” <br>
 29     android:descendantFocusability=”afterDescendants” <br>
 30     &gt; <br>
     ……………………………… <br>
 71                 &lt;-com.android.systemui.statusbar.phone.IconMerger android:id=”@+id/notificationIcons” <br>
 72                     android:layout_width=”match_parent” <br>
 73                     android:layout_height=”match_parent” <br>
 74                     android:layout_alignParentStart=”true” <br>
 75                     android:gravity=”center_vertical” <br>
 76                     android:orientation=”horizontal”/&gt; <br>
 77             &lt;-/com.android.keyguard.AlphaOptimizedLinearLayout&gt; <br>
 78         &lt;-/com.android.systemui.statusbar.AlphaOptimizedFrameLayout&gt; <br>
 79  <br>
 80         &lt;-com.android.keyguard.AlphaOptimizedLinearLayout android:id=”@+id/system_icon_area” <br>
 81             android:layout_width=”wrap_content” <br>
 82             android:layout_height=”match_parent” <br>
 83             android:orientation=”horizontal” <br>
 84             &gt; <br>
 85  <br>
 86             &lt;-include layout=”@layout/system_icons” /&gt; <br>
 87  <br>
 88             &lt;-com.android.systemui.statusbar.policy.Clock <br>
 89                 android:id=”@+id/clock” <br>
 90                 android:textAppearance=”@style/TextAppearance.StatusBar.Clock” <br>
 91                 android:layout_width=”wrap_content” <br>
 92                 android:layout_height=”match_parent” <br>
 93                 android:singleLine=”true” <br>
 94                 android:paddingStart=”7dp” <br>
 95                 android:gravity=”center_vertical|start” <br>
 96                 /&gt; <br>
 97         &lt;-/com.android.keyguard.AlphaOptimizedLinearLayout&gt; <br>
 98     &lt;-/LinearLayout&gt;</p>


<p>我们来看下对比图是怎样的: <br>
         <img src="http://img.blog.csdn.net/20150717095100653" alt="" title=""></p>


<p><img src="http://img.blog.csdn.net/20150717100914320" alt="" title="">   ———–android:id=    “@+id/notificationIcons” <br>
该部分内容显示USB/T卡/wifi链接等一些通知选项图标。 <br>
<img src="http://img.blog.csdn.net/20150717101353376" alt="" title="">   ———–android:id=”@+id/system_icon_area” <br>
该部分内容主要显示的是SIM卡/电池/时间等…………………</p>


<p>1.6  frameworks/base/packages/SystemUI/res/layout/status_bar_expanded.xml <br>
     我们先来看看这个文件中所码的内容:</p>


<p>&lt;-com.android.systemui.statusbar.phone.NotificationPanelView  <br>
 22     xmlns:android=”http://schemas.android.com/apk/res/android” <br>
 23     xmlns:systemui=”http://schemas.android.com/apk/res/com.android.systemui” <br>
 24     android:id=”@+id/notification_panel” <br>
 25     android:layout_width=”match_parent” <br>
 26     android:layout_height=”match_parent” <br>
 27     android:background=”@android:color/transparent” <br>
 28     &gt; <br>
 29  <br>
 30     &lt;-include <br>
 31         layout=”@layout/carrier_label_group” <br>
 32         android:layout_height=”wrap_content” <br>
 33         android:layout_width=”match_parent” <br>
 34         android:layout_marginBottom=”@dimen/close_handle_height” <br>
 35         android:layout_gravity=”bottom” <br>
 36         /&gt; <br>
 37  <br>
 38     &lt;-include <br>
 39         layout=”@layout/keyguard_status_view” <br>
 40         android:layout_height=”wrap_content” <br>
 41         android:visibility=”gone” /&gt; <br>
 42  <br>
 43     &lt;-TextView <br>
 44         android:id=”@+id/emergency_calls_only” <br>
 45         android:textAppearance=”@style/TextAppearance.StatusBar.Expanded.Network.EmergencyOnly” <br>
 46         android:layout_height=”wrap_content” <br>
 47         android:layout_width=”match_parent” <br>
 48         android:padding=”4dp” <br>
 49         android:gravity=”center” <br>
 50         android:visibility=”gone” <br>
 51         /&gt; <br>
 52  <br>
 53     &lt;-com.android.systemui.statusbar.phone.NotificationsQuickSettingsContainer <br>
 54         android:layout_width=”match_parent” <br>
 55         android:layout_height=”match_parent” <br>
 56         android:layout_gravity=”@integer/notification_panel_layout_gravity” <br>
 57         android:id=”@+id/notification_container_parent” <br>
 58         android:clipToPadding=”false” <br>
 59         android:clipChildren=”false”&gt; <br>
 60  <br>
 &lt;-com.android.systemui.statusbar.phone.ObservableScrollView <br>
 62             android:id=”@+id/scroll_view” <br>
 63             android:layout_width=”@dimen/notification_panel_width” <br>
 64             android:layout_height=”match_parent” <br>
 65             android:layout_gravity=”@integer/notification_panel_layout_gravity” <br>
 66             android:scrollbars=”none” <br>
 67             android:overScrollMode=”never” <br>
 68             android:fillViewport=”true”&gt; <br>
 69             &lt;-LinearLayout <br>
 70                 android:layout_width=”match_parent” <br>
 71                 android:layout_height=”wrap_content” <br>
 72                 android:orientation=”vertical”&gt; <br>
 73                 &lt;-include <br>
 74                     layout=”@layout/qs_panel” <br>
 75                     android:layout_marginTop=”@dimen/status_bar_header_height_expanded” <br>
 76                     android:layout_width=”match_parent” <br>
 77                     android:layout_height=”wrap_content” <br>
 78                     android:layout_marginLeft=”@dimen/notification_side_padding” <br>
 79                     android:layout_marginRight=”@dimen/notification_side_padding”/&gt; <br>
 80  <br>
 81                 <!-- A view to reserve space for the collapsed stack --> <br>
 82                 <!-- Layout height: notification_min_height + bottom_stack_peek_amount --> <br>
 83                 &lt;-View <br>
 84                     android:id=”@+id/reserve_notification_space” <br>
 85                     android:layout_height=”@dimen/min_stack_height” <br>
 86                     android:layout_width=”match_parent” <br>
 87                     android:layout_marginTop=”@dimen/notifications_top_padding” /&gt; <br>
 88  <br>
 89                 &lt;-View <br>
 90                     android:layout_height=”@dimen/notification_side_padding” <br>
 91                     android:layout_width=”match_parent” /&gt; <br>
 92             &lt;-/LinearLayout&gt; <br>
 93         &lt;-/com.android.systemui.statusbar.phone.ObservableScrollView&gt; <br>
 94  <br>
 95         &lt;-com.android.systemui.statusbar.stack.NotificationStackScrollLayout <br>
 96             android:id=”@+id/notification_stack_scroller” <br>
 97             android:layout_width=”@dimen/notification_panel_width” <br>
 98             android:layout_height=”match_parent” <br>
 99             android:layout_gravity=”@integer/notification_panel_layout_gravity” <br>
100             android:layout_marginTop=”-10dp” <br>
101             android:layout_marginBottom=”@dimen/close_handle_underlap” <br>
102             android:importantForAccessibility=”no” /&gt; <br>
103  <br>
104         &lt;-ViewStub <br>
105             android:id=”@+id/keyguard_user_switcher” <br>
106             android:layout=”@layout/keyguard_user_switcher” <br>
android:layout_height=”match_parent” <br>
108             android:layout_width=”match_parent” /&gt; <br>
109  <br>
110         &lt;-include <br>
111             layout=”@layout/keyguard_status_bar” <br>
112             android:visibility=”invisible” /&gt; <br>
113  <br>
114     &lt;-/com.android.systemui.statusbar.phone.NotificationsQuickSettingsContainer&gt; <br>
115  <br>
116     &lt;-include <br>
117             layout=”@layout/keyguard_bottom_area” <br>
118             android:visibility=”gone” /&gt; <br>
119  <br>
120     &lt;-include layout=”@layout/status_bar_expanded_header” /&gt; <br>
121  <br>
122     &lt;-com.android.systemui.statusbar.AlphaOptimizedView <br>
123         android:id=”@+id/qs_navbar_scrim” <br>
124         android:layout_height=”96dp” <br>
125         android:layout_width=”match_parent” <br>
126         android:layout_gravity=”bottom” <br>
127         android:visibility=”invisible” <br>
128         android:background=”@drawable/qs_navbar_scrim” /&gt; <br>
129  <br>
130 &lt;-/com.android.systemui.statusbar.phone.NotificationPanelView&gt;<!-- end of sliding panel --></p>


<p>我们先来看看真机上的效果图: <br>
<img src="http://img.blog.csdn.net/20150717104110154" alt="这里写图片描述" title=""> <br>
这就是我们真机上的效果图,这是我们status展开后的效果图,没有展开的我们上面已经分析过了,这里就不再重复。</p>


<p>下面我们来看下这个效果图主要是由那些部分组合而成的, <br>
<img src="http://img.blog.csdn.net/20150717104340518" alt="这里写图片描述" title=""> <br>
这个部分我们看到,并没有在这status_bar_expanded.xml中直接进行定义,但是我们可以通过 <br>
    android:id=”@+id/header” <br>
这个ID反方向去寻找在status_bar_expanded.xml中是怎么调用的,我们通过搜索知道 <br>
    android:id=”@+id/header” <br>
这个其实是在 <br>
    status_bar_expanded_header.xml <br>
这里进行定义的,找到这里,我们就能清楚的看到,其实在status_bar_expanded.xml中有对status_bar_expanded_header.xml的调用, <br>
         &lt;-include layout=”@layout/status_bar_expanded_header” /&gt; <br>
到了这里,我们就不继续对status_bar_expanded_header.xml这个文件进行分析了,进入到该文件中,我们能清楚明白的看到各个id的应用。</p>


<p>下面我们继续看最地下的通知信息栏是在哪里加载的,如下如所示: <br>
<img src="http://img.blog.csdn.net/20150717105733575" alt="这里写图片描述" title=""> <br>
在这里,该部分内容是在 <br>
&lt;-com.android.systemui.statusbar.stack.NotificationStackScrollLayout <br>
 96             android:id=”@+id/notification_stack_scroller” <br>
 97             android:layout_width=”@dimen/notification_panel_width” <br>
 98             android:layout_height=”match_parent” <br>
 99             android:layout_gravity=”@integer/notification_panel_layout_gravity” <br>
100             android:layout_marginTop=”-10dp” <br>
101             android:layout_marginBottom=”@dimen/close_handle_underlap” <br>
102             android:importantForAccessibility=”no” /&gt; <br>
这里进行添加的,我们可以看到otification_stack_scroller其实在这个效果图里面是没有展开的,而是重叠在一起的,但是我们在这里不进行进一步的分析。</p>


<p>现在,我们来看最后一部分内容,就是快捷键的使用,我们先看下效果图,如下: <br>
<img src="http://img.blog.csdn.net/20150717110301903" alt="这里写图片描述" title=""> <br>
通过android:id的定位,我们知道,该部分内容是在这里 <br>
&lt;-com.android.systemui.statusbar.phone.ObservableScrollView <br>
 62             android:id=”@+id/scroll_view” <br>
 63             android:layout_width=”@dimen/notification_panel_width” <br>
 64             android:layout_height=”match_parent” <br>
 65             android:layout_gravity=”@integer/notification_panel_layout_gravity” <br>
 66             android:scrollbars=”none” <br>
 67             android:overScrollMode=”never” <br>
 68             android:fillViewport=”true”&gt; <br>
 69             &lt;-LinearLayout <br>
 70                 android:layout_width=”match_parent” <br>
 71                 android:layout_height=”wrap_content” <br>
 72                 android:orientation=”vertical”&gt; <br>
 73                 &lt;-include <br>
 74                     layout=”@layout/qs_panel” <br>
 75                     android:layout_marginTop=”@dimen/status_bar_header_height_expanded” <br>
 76                     android:layout_width=”match_parent” <br>
 77                     android:layout_height=”wrap_content” <br>
 78                     android:layout_marginLeft=”@dimen/notification_side_padding” <br>
 79                     android:layout_marginRight=”@dimen/notification_side_padding”/&gt; <br>
 80  <br>
 81                 <!-- A view to reserve space for the collapsed stack --> <br>
 82                 &lt;-!– Layout height: notification_min_height + bottom_stack_peek_amount –&gt; <br>
 83                 &lt;-View <br>
 84                     android:id=”@+id/reserve_notification_space” <br>
 85                     android:layout_height=”@dimen/min_stack_height” <br>
 86                     android:layout_width=”match_parent” <br>
 87                     android:layout_marginTop=”@dimen/notifications_top_padding” /&gt; <br>
 88 <br>
 89                 &lt;-View <br>
 90                     android:layout_height=”@dimen/notification_side_padding” <br>
 91                     android:layout_width=”match_parent” /&gt; <br>
 92             &lt;-/LinearLayout&gt; <br>
 93         &lt;-/com.android.systemui.statusbar.phone.ObservableScrollView&gt; <br>
 进行加载.</p>


<p>2.0  下面我们来对相关的各个模块一一进行剖析 <br>
2.0.1 下面我们先来分析 android:id=”@+id/brightness_slider” <br>
   先上图: <br>
    <img src="http://img.blog.csdn.net/20150717162106528" alt="这里写图片描述" title=""> <br>
我们全局搜索“brightness_slider”看看有什么收获 <br>
1     33  frameworks/base/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml &lt;&lt;&gt;&gt; <br>
                     android:id=”@+id/brightness_slider” <br>
   2    109  frameworks/base/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java &lt;&lt;&gt;&gt; <br>
                             (ToggleSlider) findViewById(R.id.brightness_slider)); <br>
   3    126  frameworks/base/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java &lt;&lt;&gt;&gt; <br>
                     ToggleSlider brightnessSlider = (ToggleSlider) findViewById(R.id.brightness_slider); <br>
   4    127  frameworks/base/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java &lt;&lt;&gt;&gt; <br>
                     ToggleSlider mirror = (ToggleSlider) c.getMirror().findViewById(R.id.brightness_slider); <br>
   5     51  frameworks/base/packages/SystemUI/src/com/android/systemui/settings/BrightnessDialog.java &lt;&lt;&gt;&gt; <br>
                     final ToggleSlider slider = (ToggleSlider) findViewById(R.id.brightness_slider);</p>


<p>从这里我们看到,brightness_slider是在quick_settings_brightness_dialog.xml里添加的id,那么我们就在看看是哪里调用的quick_settings_brightness_dialog.xml文件, <br>
 1     99  frameworks/base/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java &lt;&gt; <br>
             R.layout.quick_settings_brightness_dialog, this, false); <br>
   2     48  frameworks/base/packages/SystemUI/src/com/android/systemui/settings/BrightnessDialog.java &lt;&gt; <br>
             setContentView(R.layout.quick_settings_brightness_dialog); <br>
原来是在QSPanel.java中调用的xml, <br>
    mBrightnessView = LayoutInflater.from(context).inflate(R.layout.quick_settings_brightness_dialog, this, false); <br>
为了更直观的看到这个调用顺序,我们在 <br>
    public QSPanel(Context context, AttributeSet attrs) <br>
中把调用堆栈给打印出来看看: <br>
    0java.lang.Throwable <br>
    at com.android.systemui.qs.QSPanel.(QSPanel.java:89) <br>
    at java.lang.reflect.Constructor.newInstance(Native Method) <br>
    at java.lang.reflect.Constructor.newInstance(Constructor.java:288) <br>
    at android.view.LayoutInflater.createView(LayoutInflater.java:607) <br>
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:743) <br>
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:806) <br>
    at android.view.LayoutInflater.parseInclude(LayoutInflater.java:916) <br>
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:802) <br>
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:809) <br>
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:809) <br>
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:809) <br>
    at android.view.LayoutInflater.parseInclude(LayoutInflater.java:916) <br>
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:802) <br>
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:809) <br>
    at android.view.LayoutInflater.inflate(LayoutInflater.java:504) <br>
    at android.view.LayoutInflater.inflate(LayoutInflater.java:414) <br>
    at android.view.LayoutInflater.inflate(LayoutInflater.java:365) <br>
    at android.view.View.inflate(View.java:18547) <br>
    at com.android.systemui.statusbar.phone.PhoneStatusBar.makeStatusBarView(PhoneStatusBar.java:648) <br>
    at com.android.systemui.statusbar.phone.PhoneStatusBar.addStatusBarWindow(PhoneStatusBar.java:3087) <br>
    at com.android.systemui.statusbar.phone.PhoneStatusBar.createAndAddWindows(PhoneStatusBar.java:3083) <br>
    at com.android.systemui.statusbar.BaseStatusBar.start(BaseStatusBar.java:564) <br>
    at com.android.systemui.statusbar.phone.PhoneStatusBar.start(PhoneStatusBar.java:598) <br>
    at com.android.systemui.statusbar.SystemBars.createStatusBarFromConfig(SystemBars.java:107) <br>
    at com.android.systemui.statusbar.SystemBars.onNoService(SystemBars.java:59) <br>
    at com.android.systemui.statusbar.ServiceMonitor.startService(ServiceMonitor.java:228) <br>
    at com.android.systemui.statusbar.ServiceMonitor.access<span class="MathJax_Preview"></span><span class="MathJax" id="MathJax-Element-12-Frame" role="textbox" aria-readonly="true"><nobr><span class="math" id="MathJax-Span-1" style="width: 42.86em; display: inline-block;"><span style="display: inline-block; position: relative; width: 36.949em; height: 0px; font-size: 116%;"><span style="position: absolute; clip: rect(1.789em 1000em 3.143em -0.49em); top: -2.706em; left: 0.003em;"><span class="mrow" id="MathJax-Span-2"><span class="mn" id="MathJax-Span-3" style="font-family: MathJax_Main;">000</span><span class="mo" id="MathJax-Span-4" style="font-family: MathJax_Main;">(</span><span class="mi" id="MathJax-Span-5" style="font-family: MathJax_Math-italic;">S<span style="display: inline-block; overflow: hidden; height: 1px; width: 0.065em;"></span></span><span class="mi" id="MathJax-Span-6" style="font-family: MathJax_Math-italic;">e</span><span class="mi" id="MathJax-Span-7" style="font-family: MathJax_Math-italic;">r</span><span class="mi" id="MathJax-Span-8" style="font-family: MathJax_Math-italic;">v</span><span class="mi" id="MathJax-Span-9" style="font-family: MathJax_Math-italic;">i</span><span class="mi" id="MathJax-Span-10" style="font-family: MathJax_Math-italic;">c</span><span class="mi" id="MathJax-Span-11" style="font-family: MathJax_Math-italic;">e</span><span class="mi" id="MathJax-Span-12" style="font-family: MathJax_Math-italic;">M<span style="display: inline-block; overflow: hidden; height: 1px; width: 0.065em;"></span></span><span class="mi" id="MathJax-Span-13" style="font-family: MathJax_Math-italic;">o</span><span class="mi" id="MathJax-Span-14" style="font-family: MathJax_Math-italic;">n</span><span class="mi" id="MathJax-Span-15" style="font-family: MathJax_Math-italic;">i</span><span class="mi" id="MathJax-Span-16" style="font-family: MathJax_Math-italic;">t</span><span class="mi" id="MathJax-Span-17" style="font-family: MathJax_Math-italic;">o</span><span class="mi" id="MathJax-Span-18" style="font-family: MathJax_Math-italic;">r</span><span class="mo" id="MathJax-Span-19" style="font-family: MathJax_Main;">.</span><span class="mi" id="MathJax-Span-20" style="font-family: MathJax_Math-italic; padding-left: 0.188em;">j</span><span class="mi" id="MathJax-Span-21" style="font-family: MathJax_Math-italic;">a</span><span class="mi" id="MathJax-Span-22" style="font-family: MathJax_Math-italic;">v</span><span class="mi" id="MathJax-Span-23" style="font-family: MathJax_Math-italic;">a</span><span class="mo" id="MathJax-Span-24" style="font-family: MathJax_Main; padding-left: 0.311em;">:</span><span class="mn" id="MathJax-Span-25" style="font-family: MathJax_Main; padding-left: 0.311em;">49</span><span class="mo" id="MathJax-Span-26" style="font-family: MathJax_Main;">)</span><span class="mi" id="MathJax-Span-27" style="font-family: MathJax_Math-italic;">a</span><span class="mi" id="MathJax-Span-28" style="font-family: MathJax_Math-italic;">t</span><span class="mi" id="MathJax-Span-29" style="font-family: MathJax_Math-italic;">c</span><span class="mi" id="MathJax-Span-30" style="font-family: MathJax_Math-italic;">o</span><span class="mi" id="MathJax-Span-31" style="font-family: MathJax_Math-italic;">m</span><span class="mo" id="MathJax-Span-32" style="font-family: MathJax_Main;">.</span><span class="mi" id="MathJax-Span-33" style="font-family: MathJax_Math-italic; padding-left: 0.188em;">a</span><span class="mi" id="MathJax-Span-34" style="font-family: MathJax_Math-italic;">n</span><span class="mi" id="MathJax-Span-35" style="font-family: MathJax_Math-italic;">d<span style="display: inline-block; overflow: hidden; height: 1px; width: 0.003em;"></span></span><span class="mi" id="MathJax-Span-36" style="font-family: MathJax_Math-italic;">r</span><span class="mi" id="MathJax-Span-37" style="font-family: MathJax_Math-italic;">o</span><span class="mi" id="MathJax-Span-38" style="font-family: MathJax_Math-italic;">i</span><span class="mi" id="MathJax-Span-39" style="font-family: MathJax_Math-italic;">d<span style="display: inline-block; overflow: hidden; height: 1px; width: 0.003em;"></span></span><span class="mo" id="MathJax-Span-40" style="font-family: MathJax_Main;">.</span><span class="mi" id="MathJax-Span-41" style="font-family: MathJax_Math-italic; padding-left: 0.188em;">s</span><span class="mi" id="MathJax-Span-42" style="font-family: MathJax_Math-italic;">y<span style="display: inline-block; overflow: hidden; height: 1px; width: 0.003em;"></span></span><span class="mi" id="MathJax-Span-43" style="font-family: MathJax_Math-italic;">s</span><span class="mi" id="MathJax-Span-44" style="font-family: MathJax_Math-italic;">t</span><span class="mi" id="MathJax-Span-45" style="font-family: MathJax_Math-italic;">e</span><span class="mi" id="MathJax-Span-46" style="font-family: MathJax_Math-italic;">m</span><span class="mi" id="MathJax-Span-47" style="font-family: MathJax_Math-italic;">u</span><span class="mi" id="MathJax-Span-48" style="font-family: MathJax_Math-italic;">i</span><span class="mo" id="MathJax-Span-49" style="font-family: MathJax_Main;">.</span><span class="mi" id="MathJax-Span-50" style="font-family: MathJax_Math-italic; padding-left: 0.188em;">s</span><span class="mi" id="MathJax-Span-51" style="font-family: MathJax_Math-italic;">t</span><span class="mi" id="MathJax-Span-52" style="font-family: MathJax_Math-italic;">a</span><span class="mi" id="MathJax-Span-53" style="font-family: MathJax_Math-italic;">t</span><span class="mi" id="MathJax-Span-54" style="font-family: MathJax_Math-italic;">u</span><span class="mi" id="MathJax-Span-55" style="font-family: MathJax_Math-italic;">s</span><span class="mi" id="MathJax-Span-56" style="font-family: MathJax_Math-italic;">b</span><span class="mi" id="MathJax-Span-57" style="font-family: MathJax_Math-italic;">a</span><span class="mi" id="MathJax-Span-58" style="font-family: MathJax_Math-italic;">r</span><span class="mo" id="MathJax-Span-59" style="font-family: MathJax_Main;">.</span><span class="mi" id="MathJax-Span-60" style="font-family: MathJax_Math-italic; padding-left: 0.188em;">S<span style="display: inline-block; overflow: hidden; height: 1px; width: 0.065em;"></span></span><span class="mi" id="MathJax-Span-61" style="font-family: MathJax_Math-italic;">e</span><span class="mi" id="MathJax-Span-62" style="font-family: MathJax_Math-italic;">r</span><span class="mi" id="MathJax-Span-63" style="font-family: MathJax_Math-italic;">v</span><span class="mi" id="MathJax-Span-64" style="font-family: MathJax_Math-italic;">i</span><span class="mi" id="MathJax-Span-65" style="font-family: MathJax_Math-italic;">c</span><span class="mi" id="MathJax-Span-66" style="font-family: MathJax_Math-italic;">e</span><span class="mi" id="MathJax-Span-67" style="font-family: MathJax_Math-italic;">M<span style="display: inline-block; overflow: hidden; height: 1px; width: 0.065em;"></span></span><span class="mi" id="MathJax-Span-68" style="font-family: MathJax_Math-italic;">o</span><span class="mi" id="MathJax-Span-69" style="font-family: MathJax_Math-italic;">n</span><span class="mi" id="MathJax-Span-70" style="font-family: MathJax_Math-italic;">i</span><span class="mi" id="MathJax-Span-71" style="font-family: MathJax_Math-italic;">t</span><span class="mi" id="MathJax-Span-72" style="font-family: MathJax_Math-italic;">o</span><span class="mi" id="MathJax-Span-73" style="font-family: MathJax_Math-italic;">r</span></span><span style="display: inline-block; width: 0px; height: 2.712em;"></span></span></span><span style="border-left: 0.004em solid; display: inline-block; overflow: hidden; width: 0px; height: 1.289em; vertical-align: -0.354em; color: rgb(255, 255, 255);"></span></span></nobr></span><script type="math/tex" id="MathJax-Element-12">000(ServiceMonitor.java:49)  
    at com.android.systemui.statusbar.ServiceMonitor</script>1.handleMessage(ServiceMonitor.java:73) <br>
    at android.os.Handler.dispatchMessage(Handler.java:102) <br>
    at android.os.Looper.loop(Looper.java:135) <br>
    at android.app.ActivityThread.main(ActivityThread.java:5345) <br>
    at java.lang.reflect.Method.invoke(Native Method) <br>
    at java.lang.reflect.Method.invoke(Method.java:372) <br>
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:947) <br>
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:742)</p>


<p>从上面的调用中我们可以看到, <br>
frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java <br>
的protected PhoneStatusBarView makeStatusBarView(){}; <br>
    mStatusBarWindow = (StatusBarWindowView) View.inflate(context,R.layout.super_status_bar, null); <br>
这个语句中动态加载的。</p>


<p>2.1   设置header视图中的位置信息:   <strong>updateHeaderShade</strong>()</p>






<pre class="prettyprint" name="code"><code class="hljs avrasm has-numbering">at <span class="hljs-keyword">com</span><span class="hljs-preprocessor">.android</span><span class="hljs-preprocessor">.systemui</span><span class="hljs-preprocessor">.statusbar</span><span class="hljs-preprocessor">.phone</span><span class="hljs-preprocessor">.NotificationPanelView</span>.**updateHeaderShade**(NotificationPanelView<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">1510</span>)
    at <span class="hljs-keyword">com</span><span class="hljs-preprocessor">.android</span><span class="hljs-preprocessor">.systemui</span><span class="hljs-preprocessor">.statusbar</span><span class="hljs-preprocessor">.phone</span><span class="hljs-preprocessor">.NotificationPanelView</span><span class="hljs-preprocessor">.updateHeader</span>(NotificationPanelView<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">1502</span>)
    at <span class="hljs-keyword">com</span><span class="hljs-preprocessor">.android</span><span class="hljs-preprocessor">.systemui</span><span class="hljs-preprocessor">.statusbar</span><span class="hljs-preprocessor">.phone</span><span class="hljs-preprocessor">.NotificationPanelView</span><span class="hljs-preprocessor">.onHeightUpdated</span>(NotificationPanelView<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">1379</span>)
    at <span class="hljs-keyword">com</span><span class="hljs-preprocessor">.android</span><span class="hljs-preprocessor">.systemui</span><span class="hljs-preprocessor">.statusbar</span><span class="hljs-preprocessor">.phone</span><span class="hljs-preprocessor">.PanelView</span><span class="hljs-preprocessor">.setExpandedHeightInternal</span>(PanelView<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">660</span>)
    at <span class="hljs-keyword">com</span><span class="hljs-preprocessor">.android</span><span class="hljs-preprocessor">.systemui</span><span class="hljs-preprocessor">.statusbar</span><span class="hljs-preprocessor">.phone</span><span class="hljs-preprocessor">.PanelView</span><span class="hljs-preprocessor">.onTouchEvent</span>(PanelView<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">315</span>)
    at <span class="hljs-keyword">com</span><span class="hljs-preprocessor">.android</span><span class="hljs-preprocessor">.systemui</span><span class="hljs-preprocessor">.statusbar</span><span class="hljs-preprocessor">.phone</span><span class="hljs-preprocessor">.NotificationPanelView</span><span class="hljs-preprocessor">.onTouchEvent</span>(NotificationPanelView<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">707</span>)
    at <span class="hljs-keyword">com</span><span class="hljs-preprocessor">.android</span><span class="hljs-preprocessor">.systemui</span><span class="hljs-preprocessor">.statusbar</span><span class="hljs-preprocessor">.phone</span><span class="hljs-preprocessor">.PanelBar</span><span class="hljs-preprocessor">.onTouchEvent</span>(PanelBar<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">131</span>)
    at <span class="hljs-keyword">com</span><span class="hljs-preprocessor">.android</span><span class="hljs-preprocessor">.systemui</span><span class="hljs-preprocessor">.statusbar</span><span class="hljs-preprocessor">.phone</span><span class="hljs-preprocessor">.PhoneStatusBarView</span><span class="hljs-preprocessor">.onTouchEvent</span>(PhoneStatusBarView<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">158</span>)
    at android<span class="hljs-preprocessor">.view</span><span class="hljs-preprocessor">.View</span>.**dispatchTouchEvent**(View<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">8481</span>)
    at android<span class="hljs-preprocessor">.view</span><span class="hljs-preprocessor">.ViewGroup</span><span class="hljs-preprocessor">.dispatchTransformedTouchEvent</span>(ViewGroup<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">2432</span>)
    at android<span class="hljs-preprocessor">.view</span><span class="hljs-preprocessor">.ViewGroup</span><span class="hljs-preprocessor">.dispatchTouchEvent</span>(ViewGroup<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">2103</span>)
    at android<span class="hljs-preprocessor">.view</span><span class="hljs-preprocessor">.ViewGroup</span><span class="hljs-preprocessor">.dispatchTransformedTouchEvent</span>(ViewGroup<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">2438</span>)
    at android<span class="hljs-preprocessor">.view</span><span class="hljs-preprocessor">.ViewGroup</span><span class="hljs-preprocessor">.dispatchTouchEvent</span>(ViewGroup<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">2132</span>)
    at <span class="hljs-keyword">com</span><span class="hljs-preprocessor">.android</span><span class="hljs-preprocessor">.systemui</span><span class="hljs-preprocessor">.statusbar</span><span class="hljs-preprocessor">.phone</span><span class="hljs-preprocessor">.StatusBarWindowView</span><span class="hljs-preprocessor">.dispatchTouchEvent</span>(StatusBarWindowView<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">165</span>)
    at android<span class="hljs-preprocessor">.view</span><span class="hljs-preprocessor">.View</span><span class="hljs-preprocessor">.dispatchPointerEvent</span>(View<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">8681</span>)
    at android<span class="hljs-preprocessor">.view</span><span class="hljs-preprocessor">.ViewRootImpl</span>$ViewPostImeInputStage<span class="hljs-preprocessor">.processPointerEvent</span>(ViewRootImpl<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">4123</span>)
    at android<span class="hljs-preprocessor">.view</span><span class="hljs-preprocessor">.ViewRootImpl</span>$ViewPostImeInputStage<span class="hljs-preprocessor">.onProcess</span>(ViewRootImpl<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">3989</span>)
    at android<span class="hljs-preprocessor">.view</span><span class="hljs-preprocessor">.ViewRootImpl</span>$InputStage<span class="hljs-preprocessor">.deliver</span>(ViewRootImpl<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">3544</span>)
    at android<span class="hljs-preprocessor">.view</span><span class="hljs-preprocessor">.ViewRootImpl</span>$InputStage<span class="hljs-preprocessor">.onDeliverToNext</span>(ViewRootImpl<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">3597</span>)
    at android<span class="hljs-preprocessor">.view</span><span class="hljs-preprocessor">.ViewRootImpl</span>$InputStage<span class="hljs-preprocessor">.forward</span>(ViewRootImpl<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">3563</span>)
    at android<span class="hljs-preprocessor">.view</span><span class="hljs-preprocessor">.ViewRootImpl</span>$AsyncInputStage<span class="hljs-preprocessor">.forward</span>(ViewRootImpl<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">3680</span>)
    at android<span class="hljs-preprocessor">.view</span><span class="hljs-preprocessor">.ViewRootImpl</span>$InputStage<span class="hljs-preprocessor">.apply</span>(ViewRootImpl<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">3571</span>)
    at android<span class="hljs-preprocessor">.view</span><span class="hljs-preprocessor">.ViewRootImpl</span>$AsyncInputStage<span class="hljs-preprocessor">.apply</span>(ViewRootImpl<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">3737</span>)
    at android<span class="hljs-preprocessor">.view</span><span class="hljs-preprocessor">.ViewRootImpl</span>$InputStage<span class="hljs-preprocessor">.deliver</span>(ViewRootImpl<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">3544</span>)
    at android<span class="hljs-preprocessor">.view</span><span class="hljs-preprocessor">.ViewRootImpl</span>$InputStage<span class="hljs-preprocessor">.onDeliverToNext</span>(ViewRootImpl<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">3597</span>)
    at android<span class="hljs-preprocessor">.view</span><span class="hljs-preprocessor">.ViewRootImpl</span>$InputStage<span class="hljs-preprocessor">.forward</span>(ViewRootImpl<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">3563</span>)
    at android<span class="hljs-preprocessor">.view</span><span class="hljs-preprocessor">.ViewRootImpl</span>$InputStage<span class="hljs-preprocessor">.apply</span>(ViewRootImpl<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">3571</span>)
    at android<span class="hljs-preprocessor">.view</span><span class="hljs-preprocessor">.ViewRootImpl</span>$InputStage<span class="hljs-preprocessor">.deliver</span>(ViewRootImpl<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">3544</span>)
    at android<span class="hljs-preprocessor">.view</span><span class="hljs-preprocessor">.ViewRootImpl</span><span class="hljs-preprocessor">.deliverInputEvent</span>(ViewRootImpl<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">5817</span>)
    at android<span class="hljs-preprocessor">.view</span><span class="hljs-preprocessor">.ViewRootImpl</span><span class="hljs-preprocessor">.doProcessInputEvents</span>(ViewRootImpl<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">5791</span>)
    at android<span class="hljs-preprocessor">.view</span><span class="hljs-preprocessor">.ViewRootImpl</span><span class="hljs-preprocessor">.enqueueInputEvent</span>(ViewRootImpl<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">5762</span>)
    at android<span class="hljs-preprocessor">.view</span><span class="hljs-preprocessor">.ViewRootImpl</span>$WindowInputEventReceiver<span class="hljs-preprocessor">.onInputEvent</span>(ViewRootImpl<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">5907</span>)
    at android<span class="hljs-preprocessor">.view</span><span class="hljs-preprocessor">.InputEventReceiver</span><span class="hljs-preprocessor">.dispatchInputEvent</span>(InputEventReceiver<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">185</span>)
    at android<span class="hljs-preprocessor">.view</span><span class="hljs-preprocessor">.InputEventReceiver</span><span class="hljs-preprocessor">.nativeConsumeBatchedInputEvents</span>(Native Method)
    at android<span class="hljs-preprocessor">.view</span><span class="hljs-preprocessor">.InputEventReceiver</span><span class="hljs-preprocessor">.consumeBatchedInputEvents</span>(InputEventReceiver<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">176</span>)
    at android<span class="hljs-preprocessor">.view</span><span class="hljs-preprocessor">.ViewRootImpl</span><span class="hljs-preprocessor">.doConsumeBatchedInput</span>(ViewRootImpl<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">5878</span>)
    at android<span class="hljs-preprocessor">.view</span><span class="hljs-preprocessor">.ViewRootImpl</span>$ConsumeBatchedInputRunnable<span class="hljs-preprocessor">.run</span>(ViewRootImpl<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">5930</span>)
    at android<span class="hljs-preprocessor">.view</span><span class="hljs-preprocessor">.Choreographer</span>$CallbackRecord<span class="hljs-preprocessor">.run</span>(Choreographer<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">767</span>)
    at android<span class="hljs-preprocessor">.view</span><span class="hljs-preprocessor">.Choreographer</span><span class="hljs-preprocessor">.doCallbacks</span>(Choreographer<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">580</span>)
    at android<span class="hljs-preprocessor">.view</span><span class="hljs-preprocessor">.Choreographer</span><span class="hljs-preprocessor">.doFrame</span>(Choreographer<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">548</span>)
    at android<span class="hljs-preprocessor">.view</span><span class="hljs-preprocessor">.Choreographer</span>$FrameDisplayEventReceiver<span class="hljs-preprocessor">.run</span>(Choreographer<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">753</span>)
    at android<span class="hljs-preprocessor">.os</span><span class="hljs-preprocessor">.Handler</span><span class="hljs-preprocessor">.handleCallback</span>(Handler<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">739</span>)
    at android<span class="hljs-preprocessor">.os</span><span class="hljs-preprocessor">.Handler</span><span class="hljs-preprocessor">.dispatchMessage</span>(Handler<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">95</span>)
    at android<span class="hljs-preprocessor">.os</span><span class="hljs-preprocessor">.Looper</span><span class="hljs-preprocessor">.loop</span>(Looper<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">135</span>)
    at android<span class="hljs-preprocessor">.app</span><span class="hljs-preprocessor">.ActivityThread</span><span class="hljs-preprocessor">.main</span>(ActivityThread<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">5345</span>)
    at java<span class="hljs-preprocessor">.lang</span><span class="hljs-preprocessor">.reflect</span><span class="hljs-preprocessor">.Method</span><span class="hljs-preprocessor">.invoke</span>(Native Method)
    at java<span class="hljs-preprocessor">.lang</span><span class="hljs-preprocessor">.reflect</span><span class="hljs-preprocessor">.Method</span><span class="hljs-preprocessor">.invoke</span>(Method<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">372</span>)
    at <span class="hljs-keyword">com</span><span class="hljs-preprocessor">.android</span><span class="hljs-preprocessor">.internal</span><span class="hljs-preprocessor">.os</span><span class="hljs-preprocessor">.ZygoteInit</span>$MethodAndArgsCaller<span class="hljs-preprocessor">.run</span>(ZygoteInit<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">947</span>)
    at <span class="hljs-keyword">com</span><span class="hljs-preprocessor">.android</span><span class="hljs-preprocessor">.internal</span><span class="hljs-preprocessor">.os</span><span class="hljs-preprocessor">.ZygoteInit</span><span class="hljs-preprocessor">.main</span>(ZygoteInit<span class="hljs-preprocessor">.java</span>:<span class="hljs-number">742</span>)</code><ul class="pre-numbering" style="opacity: 0;"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li></ul></pre>


<p>我们看到,每当有点击事件的时候,都会去更新header的y轴的数据信息,从负值一直到零,注意这里最大的值是零。</p>


<p>总结,以上是对SystemUi的一些简单分析,在这里对启动的流程,各个文件的布局进行了一些简单的分析,这里面有许多细节的东西没有去进行更进一步的剖析,后面有时间会讲这些细节的东西补上。</p></div>
        <script type="text/javascript">
            $(function () {
                $('pre.prettyprint code').each(function () {
                    var lines = $(this).text().split('\n').length;
                    var $numbering = $('<ul></ul>').addClass('pre-numbering').hide();
                    $(this).addClass('has-numbering').parent().append($numbering);
                    for (i = 1; i <= lines; i++) {
                        $numbering.append($('<li></li>').text(i));
                    };
                    $numbering.fadeIn(1700);
                });
            });
        </script>
   
</div>








<!-- Baidu Button BEGIN -->








<div class="bdsharebuttonbox tracking-ad bdshare-button-style0-16" style="float: right;" data-mod="popu_172" data-bd-bind="1496633162180">
<a href="#" class="bds_more" data-cmd="more" style="background-position:0 0 !important; background-image: url(http://bdimg.share.baidu.com/static/api/img/share/icons_0_16.png?v=d754dcc0.png) !important" target="_blank"></a>
<a href="#" class="bds_qzone" data-cmd="qzone" title="分享到QQ空间" style="background-position:0 -52px !important" target="_blank"></a>
<a href="#" class="bds_tsina" data-cmd="tsina" title="分享到新浪微博" style="background-position:0 -104px !important" target="_blank"></a>
<a href="#" class="bds_tqq" data-cmd="tqq" title="分享到腾讯微博" style="background-position:0 -260px !important" target="_blank"></a>
<a href="#" class="bds_renren" data-cmd="renren" title="分享到人人网" style="background-position:0 -208px !important" target="_blank"></a>
<a href="#" class="bds_weixin" data-cmd="weixin" title="分享到微信" style="background-position:0 -1612px !important" target="_blank"></a>
</div>
<script>window._bd_share_config = { "common": { "bdSnsKey": {}, "bdText": "", "bdMini": "1", "bdMiniList": false, "bdPic": "", "bdStyle": "0", "bdSize": "16" }, "share": {} }; with (document) 0[(getElementsByTagName('head')[0] || body).appendChild(createElement('script')).src = 'http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion=' + ~(-new Date() / 36e5)];</script>
<!-- Baidu Button END -->


   


    
<!--172.16.140.12-->


<!-- Baidu Button BEGIN -->
<script type="text/javascript" id="bdshare_js" data="type=tools&amp;uid=1536434" src="http://bdimg.share.baidu.com/static/js/bds_s_v2.js?cdnversion=415732"></script>


<script type="text/javascript">
    document.getElementById("bdshell_js").src = "http://bdimg.share.baidu.com/static/js/shell_v2.js?cdnversion=" + Math.ceil(new Date()/3600000)
</script>
<!-- Baidu Button END -->






 




        <div id="digg" articleid="46890239">
            <dl id="btnDigg" class="digg digg_enable" onclick="btndigga();">
               
                 <dt>顶</dt>
                <dd>5</dd>
            </dl>
           
              
            <dl id="btnBury" class="digg digg_enable" onclick="btnburya();">
              
                  <dt>踩</dt>
                <dd>0</dd>               
            </dl>
            
        </div>
     <div class="tracking-ad" data-mod="popu_222"><a href="javascript:void(0);" target="_blank">&nbsp;</a>   </div>
    <div class="tracking-ad" data-mod="popu_223"> <a href="javascript:void(0);" target="_blank">&nbsp;</a></div>
    <script type="text/javascript">
                function btndigga() {
                    $(".tracking-ad[data-mod='popu_222'] a").click();
                }
                function btnburya() {
                    $(".tracking-ad[data-mod='popu_223'] a").click();
                }
            </script>


   <ul class="article_next_prev">
                <li class="next_article"><span onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_xiayipian']);location.href='/lz99770337/article/details/46965257';">下一篇</span><a href="/lz99770337/article/details/46965257" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_xiayipian'])">Calculator源码分析</a></li>
    </ul>


    <div style="clear:both; height:10px;"></div>




            <div class="similar_article">
                    <h4></h4>
                    <div class="similar_c" style="margin:20px 0px 0px 0px">
                        <div class="similar_c_t">
                          &nbsp;&nbsp;相关文章推荐
                        </div>
                   
                        <div class="similar_wrap tracking-ad" data-mod="popu_36" style="max-height:195px;">                       
                            <ul class="similar_list fl">    
                                   <li>
                                       <em>•</em>
                                       <a href="http://blog.csdn.net/zhudaozhuan/article/details/50816086" title="android 6.0 SystemUI源码分析(1)-SystemUI介绍" strategy="SearchAlgorithm" target="_blank" style="width: 290px;">android 6.0 SystemUI源码分析(1)-SystemUI介绍</a>
                                   </li>
                                   <li>
                                       <em>•</em>
                                       <a href="http://blog.csdn.net/Picasso_L/article/details/69388919" title="android7.x SystemUI源码分析(1)" strategy="SearchAlgorithm" target="_blank" style="width: 290px;">android7.x SystemUI源码分析(1)</a>
                                   </li>
                                   <li>
                                       <em>•</em>
                                       <a href="http://blog.csdn.net/zhudaozhuan/article/details/50819499" title="android 6.0 SystemUI源码分析(3)-Recent Panel加载显示流程" strategy="SearchAlgorithm" target="_blank" style="width: 290px;">android 6.0 SystemUI源码分析(3)-Recent Panel加载显示流程</a>
                                   </li>
                                   <li>
                                       <em>•</em>
                                       <a href="http://blog.csdn.net/qq_27215521/article/details/62231208" title="SystemUI源码分析三(StatusBar的加载流程)" strategy="SearchAlgorithm" target="_blank" style="width: 290px;">SystemUI源码分析三(StatusBar的加载流程)</a>
                                   </li>
                                   <li>
                                       <em>•</em>
                                       <a href="http://blog.csdn.net/zhudaozhuan/article/details/50817180" title="android 6.0 SystemUI源码分析(2)-SystemUI启动流程" strategy="SearchAlgorithm" target="_blank" style="width: 290px;">android 6.0 SystemUI源码分析(2)-SystemUI启动流程</a>
                                   </li>
                            </ul>
                              <ul class="similar_list fr">      
                                   <li>
                                       <em>•</em>
                                       <a href="http://blog.csdn.net/zhudaozhuan/article/details/50829736" title="android 6.0 SystemUI源码分析(4)-StatusBar显示流程" strategy="SearchAlgorithm" target="_blank" style="width: 290px;">android 6.0 SystemUI源码分析(4)-StatusBar显示流程</a>
                                   </li>
                                   <li>
                                       <em>•</em>
                                       <a href="http://blog.csdn.net/qq_27215521/article/details/62888832" title="SystemUI源码分析四(QSPanel显示的流程)" strategy="SearchAlgorithm" target="_blank" style="width: 290px;">SystemUI源码分析四(QSPanel显示的流程)</a>
                                   </li>
                                   <li>
                                       <em>•</em>
                                       <a href="http://blog.csdn.net/zrf1335348191/article/details/54377042" title="Android6.0锁屏源码分析之界面布局分析" strategy="SearchAlgorithm" target="_blank" style="width: 290px;">Android6.0锁屏源码分析之界面布局分析</a>
                                   </li>
                                   <li>
                                       <em>•</em>
                                       <a href="http://blog.csdn.net/zhudaozhuan/article/details/50876755" title="android 6.0 SystemUI源码分析(6)-StorageNotification介绍" strategy="SearchAlgorithm" target="_blank" style="width: 290px;">android 6.0 SystemUI源码分析(6)-StorageNotification介绍</a>
                                   </li>
                                   <li>
                                       <em>•</em>
                                       <a href="http://blog.csdn.net/u011239443/article/details/53894611" title="深入理解Spark 2.1 Core (一):RDD的原理与源码分析" strategy="SearchAlgorithm" target="_blank" style="width: 290px;">深入理解Spark 2.1 Core (一):RDD的原理与源码分析</a>
                                   </li>
                            </ul>
                        </div>
                    </div>
                </div>   
      
</div>


    <div>
        


        <script type="text/javascript">
            /*博客内容页下方Banner1-728*90,创建于2016-12-13*/
            var cpro_id = "u2843949";
        </script>
        <script type="text/javascript" src="http://cpro.baidustatic.com/cpro/ui/c.js"></script><div id="BAIDU_SSP__wrapper_u2843949_0"><iframe id="iframeu2843949_0" src="http://pos.baidu.com/oclm?rdid=2843949&amp;dc=3&amp;di=u2843949&amp;dri=0&amp;dis=0&amp;dai=1&amp;ps=18337x656&amp;dcb=___adblockplus&amp;dtm=HTML_POST&amp;dvi=0.0&amp;dci=-1&amp;dpt=none&amp;tsr=0&amp;tpr=1496633161086&amp;ti=SystemUI%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90%20-%20lz99770337%E7%9A%84%E5%8D%9A%E5%AE%A2%20-%20%E5%8D%9A%E5%AE%A2%E9%A2%91%E9%81%93%20-%20CSDN.NET&amp;ari=2&amp;dbv=2&amp;drs=1&amp;pcs=1850x965&amp;pss=1850x18355&amp;cfv=0&amp;cpl=5&amp;chi=1&amp;cce=true&amp;cec=UTF-8&amp;tlm=1496633161&amp;rw=965&amp;ltu=http%3A%2F%2Fblog.csdn.net%2Flz99770337%2Farticle%2Fdetails%2F46890239&amp;ltr=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DtTckok-p-vdiLd7Odffw9oQ_sBM-CY0GfZUzSvKw1HEgBb79642TAWTsC_1F9jLSMf_lZYn1DKNs4zBkuoBTKh4OJqQ7_ZL5_dB6WBmskXG%26wd%3D%26eqid%3Ddbf0082600024594000000035934cf45&amp;ecd=1&amp;uc=1865x1056&amp;pis=-1x-1&amp;sr=1920x1080&amp;tcn=1496633161&amp;qn=15af5cd4d79adba8&amp;tt=1496633161067.23.32.35" width="728" height="90" align="center,center" vspace="0" hspace="0" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" style="border:0;vertical-align:bottom;margin:0;width:728px;height:90px" allowtransparency="true"></iframe></div>


     </div>


<div id="suggest">


</div>
         <script language="javascript" type="text/javascript">     
             $(function(){
                 $.get("/lz99770337/svc/GetSuggestContent/46890239",function(data){
                     $("#suggest").html(data);
                 });     
             });             
         </script>  




<style>
.blog-ass-articl dd {
color: #369;
width: 99%; /*修改行*/
float: left;
overflow: hidden;
font: normal normal 12px/23px "SimSun";
height: 23px;
margin: 0;
padding: 0 0 0 10px;
margin-right: 30px;
background: url(http://static.blog.csdn.net/skin/default/images/blog-dot-red3.gif) no-repeat 0 10px;
}
</style>


 


<div id="relate" data-mod="popu_218" class="tracking-ad" style="display: block;">
        <div class="relate_t">
            <h3><span>参考知识库</span></h3>
        </div>
        <div class="relate_c"><dl class="relate_list"><dt><a target="_blank" href="http://lib.csdn.net/base/android"><img src="http://img.knowledge.csdn.net/upload/base/1455589744328_328.jpg" alt="img"></a></dt><dd><h4><a target="_blank" href="http://lib.csdn.net/base/android">Android知识库</a></h4><p><label><span>34594</span><em>关注</em><i>|</i><span>3045</span><em>收录</em></label></p></dd></dl><dl class="relate_list"><dt><a target="_blank" href="http://lib.csdn.net/base/java"><img src="http://img.knowledge.csdn.net/upload/base/1453701371636_636.jpg" alt="img"></a></dt><dd><h4><a target="_blank" href="http://lib.csdn.net/base/java">Java 知识库</a></h4><p><label><span>27507</span><em>关注</em><i>|</i><span>3746</span><em>收录</em></label></p></dd></dl><dl class="relate_list"><dt><a target="_blank" href="http://lib.csdn.net/base/javaee"><img src="http://img.knowledge.csdn.net/upload/base/1456818035722_722.jpg" alt="img"></a></dt><dd><h4><a target="_blank" href="http://lib.csdn.net/base/javaee">Java EE知识库</a></h4><p><label><span>18766</span><em>关注</em><i>|</i><span>1408</span><em>收录</em></label></p></dd></dl><dl class="relate_list"><dt><a target="_blank" href="http://lib.csdn.net/base/javase"><img src="http://img.knowledge.csdn.net/upload/base/1453169124297_297.jpg" alt="img"></a></dt><dd><h4><a target="_blank" href="http://lib.csdn.net/base/javase">Java SE知识库</a></h4><p><label><span>26588</span><em>关注</em><i>|</i><span>578</span><em>收录</em></label></p></dd></dl></div>
</div>
 


<dl class="blog-ass-articl tracking-ad" id="res-relatived" data-mod="popu_84"> 
    <div class="embody embody_b" id="libkeyparent" style="display:none">
            <span class="embody_t">更多资料请参考:</span>
            <div class="embody_c" id="libkey"></div>
    </div>




     <dt><span>猜你在找</span></dt>    




   


    
    <div id="adCollege"> 
    <div class="tracking-ad" data-mod="popu_84"><dd style="background:url(http://static.blog.csdn.net/skin/default/images/blog-dot-red3.gif) no-repeat 0 10px; white-space: nowrap;"><a href="http://edu.csdn.net/course/detail/1480" title="Android底层技术:Java层系统服务(Android Service)" strategy="v4:content" target="_blank">Android底层技术:Java层系统服务(Android Service)</a></dd><dd style="background:url(http://static.blog.csdn.net/skin/default/images/blog-dot-red3.gif) no-repeat 0 10px; white-space: nowrap;"><a href="http://edu.csdn.net/course/detail/3713" title="JavaAndroid客户端和C#服务端Web Api接口开发" strategy="v4:content" target="_blank">JavaAndroid客户端和C#服务端Web Api接口开发</a></dd><dd style="background:url(http://static.blog.csdn.net/skin/default/images/blog-dot-red3.gif) no-repeat 0 10px; white-space: nowrap;"><a href="http://edu.csdn.net/course/detail/545" title="Android入门实战教程" strategy="v4:content" target="_blank">Android入门实战教程</a></dd><dd style="background:url(http://static.blog.csdn.net/skin/default/images/blog-dot-red3.gif) no-repeat 0 10px; white-space: nowrap;"><a href="http://edu.csdn.net/course/detail/1797" title="微信公众平台深度开发Java版v2.0单品课程——语义" strategy="v4:content" target="_blank">微信公众平台深度开发Java版v2.0单品课程——语义</a></dd><dd style="background:url(http://static.blog.csdn.net/skin/default/images/blog-dot-red3.gif) no-repeat 0 10px; white-space: nowrap;"><a href="http://edu.csdn.net/course/detail/1650" title="微信公众平台深度开发Java版v2.0第2季精编版——自定义菜单、客服消息" strategy="v4:content" target="_blank">微信公众平台深度开发Java版v2.0第2季精编版——自定义菜单、客服消息</a></dd><dd style="background:url(http://static.blog.csdn.net/skin/default/images/blog-dot-red3.gif) no-repeat 0 10px; white-space: nowrap;"><a href="http://edu.csdn.net/course/detail/1419" title="微信公众平台深度开发Java版v2.0第1季精编版——接收普通消息、被动回复用户消息" strategy="v4:content" target="_blank">微信公众平台深度开发Java版v2.0第1季精编版——接收普通消息、被动回复用户消息</a></dd><dd style="background:url(http://static.blog.csdn.net/skin/default/images/blog-dot-red3.gif) no-repeat 0 10px; white-space: nowrap;"><a href="http://edu.csdn.net/course/detail/4461" title="Android高级程序开发" strategy="v4:content" target="_blank">Android高级程序开发</a></dd><dd style="background:url(http://static.blog.csdn.net/skin/default/images/blog-dot-red3.gif) no-repeat 0 10px; white-space: nowrap;"><a href="http://edu.csdn.net/course/detail/1478" title="Android底层技术:HAL驱动开发" strategy="v4:content" target="_blank">Android底层技术:HAL驱动开发</a></dd><dd style="background:url(http://static.blog.csdn.net/skin/default/images/blog-dot-red3.gif) no-repeat 0 10px; white-space: nowrap;"><a href="http://edu.csdn.net/course/detail/2238" title="Android开发-零基础到精通疯狂实战教程第二季" strategy="v4:content" target="_blank">Android开发-零基础到精通疯狂实战教程第二季</a></dd><dd style="background:url(http://static.blog.csdn.net/skin/default/images/blog-dot-red3.gif) no-repeat 0 10px; white-space: nowrap;"><a href="http://edu.csdn.net/course/detail/2237" title="Android开发-零基础到精通疯狂实战教程第一季" strategy="v4:content" target="_blank">Android开发-零基础到精通疯狂实战教程第一季</a></dd></div></div>  


    


     <script src="http://csdnimg.cn/jobreco/job_reco.js" type="text/javascript"></script> 
     <script type="text/javascript">
         csdn.position.showEdu({
             sourceType: "blog",
             searchType: "detail",
             searchKey: "46890239",
                username: "Me_Ordinary",
                recordcount: "10",
                containerId: "adCollege" //容器DIV的id。 
            });  
        </script> 
   
</dl>










    <div id="ad_cen">        
                <div>
                              <script type="text/javascript">
                                  /*博客内容页下方Banner-728*90,创建于2014-7-3*/
                                  var cpro_id = "u1607657";
                                            </script>
                              <script type="text/javascript" src="http://cpro.baidustatic.com/cpro/ui/c.js"></script><div id="BAIDU_SSP__wrapper_u1607657_0"><iframe id="iframeu1607657_0" src="http://pos.baidu.com/oclm?rdid=1607657&amp;dc=3&amp;di=u1607657&amp;dri=0&amp;dis=0&amp;dai=2&amp;ps=18519x656&amp;dcb=___adblockplus&amp;dtm=HTML_POST&amp;dvi=0.0&amp;dci=-1&amp;dpt=none&amp;tsr=0&amp;tpr=1496633161086&amp;ti=SystemUI%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90%20-%20lz99770337%E7%9A%84%E5%8D%9A%E5%AE%A2%20-%20%E5%8D%9A%E5%AE%A2%E9%A2%91%E9%81%93%20-%20CSDN.NET&amp;ari=2&amp;dbv=2&amp;drs=1&amp;pcs=1850x965&amp;pss=1850x18537&amp;cfv=0&amp;cpl=5&amp;chi=1&amp;cce=true&amp;cec=UTF-8&amp;tlm=1496633161&amp;rw=965&amp;ltu=http%3A%2F%2Fblog.csdn.net%2Flz99770337%2Farticle%2Fdetails%2F46890239&amp;ltr=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DtTckok-p-vdiLd7Odffw9oQ_sBM-CY0GfZUzSvKw1HEgBb79642TAWTsC_1F9jLSMf_lZYn1DKNs4zBkuoBTKh4OJqQ7_ZL5_dB6WBmskXG%26wd%3D%26eqid%3Ddbf0082600024594000000035934cf45&amp;ecd=1&amp;uc=1865x1056&amp;pis=-1x-1&amp;sr=1920x1080&amp;tcn=1496633161&amp;qn=f03d7c767086294d&amp;tt=1496633161067.60.61.61" width="728" height="90" align="center,center" vspace="0" hspace="0" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" style="border:0;vertical-align:bottom;margin:0;width:728px;height:90px" allowtransparency="true"></iframe></div>
                    </div>
    </div>  


        <!-- 广告位开始 -->
        <!-- 广告位结束 -->
<div class="tracking-ad" data-view="true" data-mod="ad_popu_72" data-mtp="62" data-order="40" data-con="ad_content_2072">
                 <script id="popuLayer_js_q" src="http://ads.csdn.net/js/popuLayer.js" defer="defer" type="text/javascript"></script>
            <div id="layerd" style="position: fixed; bottom: 0px; right: 0px; line-height: 0px; z-index: 1000; width: 300px; height: 278px;">
               <div class="J_close layer_close" style="display:;background-color:#efefef;padding:0px;color:#333;font:12px/24px Helvetica,Tahoma,Arial,sans-serif;text-align:right;">关闭</div><!-- 广告占位容器 --><div id="cpro_u2895327"><iframe id="iframeu2895327_0" src="http://pos.baidu.com/oclm?rdid=2895327&amp;dc=3&amp;di=u2895327&amp;dri=0&amp;dis=0&amp;dai=3&amp;ps=965x1826&amp;dcb=___adblockplus&amp;dtm=HTML_POST&amp;dvi=0.0&amp;dci=-1&amp;dpt=none&amp;tsr=0&amp;tpr=1496633161086&amp;ti=SystemUI%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90%20-%20lz99770337%E7%9A%84%E5%8D%9A%E5%AE%A2%20-%20%E5%8D%9A%E5%AE%A2%E9%A2%91%E9%81%93%20-%20CSDN.NET&amp;ari=2&amp;dbv=2&amp;drs=1&amp;pcs=1850x965&amp;pss=1850x18627&amp;cfv=0&amp;cpl=5&amp;chi=1&amp;cce=true&amp;cec=UTF-8&amp;tlm=1496633161&amp;rw=965&amp;ltu=http%3A%2F%2Fblog.csdn.net%2Flz99770337%2Farticle%2Fdetails%2F46890239&amp;ltr=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DtTckok-p-vdiLd7Odffw9oQ_sBM-CY0GfZUzSvKw1HEgBb79642TAWTsC_1F9jLSMf_lZYn1DKNs4zBkuoBTKh4OJqQ7_ZL5_dB6WBmskXG%26wd%3D%26eqid%3Ddbf0082600024594000000035934cf45&amp;ecd=1&amp;uc=1865x1056&amp;pis=-1x-1&amp;sr=1920x1080&amp;tcn=1496633161&amp;qn=2b8850c3fa248e2d&amp;tt=1496633161067.79.79.80" width="300" height="250" align="center,center" vspace="0" hspace="0" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" style="border:0;vertical-align:bottom;margin:0;width:300px;height:250px" allowtransparency="true"></iframe></div></div>
            <script>  document.getElementById("popuLayer_js_q").onload=function(){      var styObjd=styObj={width:"300px","height":parseInt(250)+28};window.CSDN.Layer.PopuLayer("#layerd",{storageName:"layerd",styleObj:styObjd,total:50,expoire:1000*60});  }</script><!-- 投放代码 --><script type="text/javascript">                /*服务器频道首页置顶Banner960*90,创建于2014-7-3*/    (window.cproArray = window.cproArray || []).push({        id: "u2895327"      });  </script>  <script src="http://cpro.baidustatic.com/cpro/ui/c.js" type="text/javascript"></script>
     
</div>


<div class="comment_class">
    <div id="comment_title" class="panel_head">
        <span class="see_comment">查看评论</span><a name="comments"></a></div>
    <div id="comment_list"><dl class="comment_item comment_topic" id="comment_item_5891431"><dt class="comment_head" floor="4">4楼 <span class="user"><a class="username" href="/qq_27604559" target="_blank">qq_27604559</a> <span class="ptime">2016-02-23 16:08发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="5891431" username="qq_27604559"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/qq_27604559" target="_blank"><img src="http://avatar.csdn.net/1/7/9/3_qq_27604559.jpg" width="40" height="40"></a></dd><dd class="comment_body">写的很好,最近在做ROM涉及到这部分东西,多谢分享</dd></dl><dl class="comment_item comment_topic" id="comment_item_5834631"><dt class="comment_head" floor="3">3楼 <span class="user"><a class="username" href="/hymgoodluck" target="_blank">hymgoodluck</a> <span class="ptime">2016-01-07 23:33发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display: none;" commentid="5834631" username="hymgoodluck"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/hymgoodluck" target="_blank"><img src="http://avatar.csdn.net/F/B/C/3_hymgoodluck.jpg" width="40" height="40"></a></dd><dd class="comment_body">很好,学习了</dd></dl><dl class="comment_item comment_topic" id="comment_item_5697507"><dt class="comment_head" floor="2">2楼 <span class="user"><a class="username" href="/qijian0503" target="_blank">我是树的种子</a> <span class="ptime">2015-12-05 13:44发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="5697507" username="qijian0503"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/qijian0503" target="_blank"><img src="http://avatar.csdn.net/9/6/3/3_qijian0503.jpg" width="40" height="40"></a></dd><dd class="comment_body">写的很好,非常感谢!</dd></dl><dl class="comment_item comment_topic" id="comment_item_5210145"><dt class="comment_head" floor="1">1楼 <span class="user"><a class="username" href="/lz99770337" target="_blank">lz99770337</a> <span class="ptime">2015-07-18 10:51发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="5210145" username="lz99770337"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/lz99770337" target="_blank"><img src="http://avatar.csdn.net/E/C/6/3_lz99770337.jpg" width="40" height="40"></a></dd><dd class="comment_body">还有些细节的东西没有去详写,后面抽空完善。</dd></dl><div class="clear"></div></div>
    <div id="comment_bar" style="display: none;">
    </div>
    <div id="comment_form"><a name="commentbox"></a><a name="reply"></a><a name="quote"></a><form action="/lz99770337/comment/submit?id=46890239" method="post" onsubmit="return subform(this);"><div class="commentform"><div class="panel_head">发表评论</div><ul><li class="left">用 户 名:</li><li class="right">Me_Ordinary</li></ul><ul><li class="left">评论内容:</li><li class="right" style="position:relative;"><div id="ubbtools"><a href="#insertcode" code="code"><img src="http://static.blog.csdn.net/images/ubb/code.gif" border="0" alt="插入代码" title="插入代码"></a></div><div id="lang_list" style="position: absolute; top: 28px; left: 0px; display: none;"><a class="long_name" href="#html">HTML/XML</a><a class="long_name" href="#objc">objective-c</a><a class="zhong_name" href="#delphi">Delphi</a><a class="zhong_name" href="#ruby">Ruby</a><a href="#php">PHP</a><a class="duan_name" href="#csharp">C#</a><a style=" border-right: none;" class="duan_name" href="#cpp">C++</a><a style=" border-bottom:none;" class="long_name" href="#javascript">JavaScript</a><a style=" border-bottom:none;" class="long_name" href="#vb">Visual Basic</a><a style=" border-bottom:none;" class="zhong_name" href="#python">Python</a><a style=" border-bottom:none;" class="zhong_name" href="#java">Java</a><a style="border-bottom:none;" class="duan_name" href="#css">CSS</a><a style="border-bottom:none;" class="duan_name" href="#sql">SQL</a><a style="border:none;" class="duan_name" href="#plain">其它</a></div><textarea class="comment_content" name="comment_content" id="comment_content" style="width: 400px; height: 200px;"></textarea></li></ul><ul><input type="hidden" id="comment_replyId" name="comment_replyId"><input type="hidden" id="comment_userId" name="comment_userId" value="521203"><input type="hidden" id="commentId" name="commentId" value=""><input type="submit" class="comment_btn" value="提交">&nbsp;&nbsp;<span id="tip_comment" style="color: Red; display: none;"></span></ul></div></form></div>
    <div class="announce">
        * 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场<a name="reply"></a><a name="quote"></a></div>
</div>


<script type="text/javascript">
    var fileName = '46890239';
    var commentscount = 4;
    var islock = false
</script>


    <div id="ad_bot">
    </div>
<div id="report_dialog">
</div>


<div id="d-top" style="bottom:60px;">


        <a id="quick-reply" class="btn btn-top q-reply" title="快速回复" style="display:none;">
            <img src="http://static.blog.csdn.net/images/blog-icon-reply.png" alt="快速回复">
        </a>    
    <a id="d-top-a" class="btn btn-top backtop" style="display: none;" title="返回顶部" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_huidaodingbu'])">         
         <img src="http://static.blog.csdn.net/images/top.png" alt="TOP">
    </a>
</div>
<script type="text/javascript">
    $(function ()
    {
        $("#ad_frm_0").height("90px");
        
        setTimeout(function(){
            $("#ad_frm_2").height("200px");
        },1000);    
    });
  
</script>
<style type="text/css">
    .tag_list
    {
        background: none repeat scroll 0 0 #FFFFFF;
        border: 1px solid #D7CBC1;
        color: #000000;
        font-size: 12px;
        line-height: 20px;
        list-style: none outside none;
        margin: 10px 2% 0 1%;
        padding: 1px;
    }
    .tag_list h5
    {
        background: none repeat scroll 0 0 #E0DBD3;
        color: #47381C;
        font-size: 12px;
        height: 24px;
        line-height: 24px;
        padding: 0 5px;
        margin: 0;
    }
    .tag_list h5 a
    {
        color: #47381C;
    }
    .classify
    {
        margin: 10px 0;
        padding: 4px 12px 8px;
    }
    .classify a
    {
        margin-right: 20px;
        white-space: nowrap;
    }
</style>




<div class="tag_list" style="">


    <h5>
        <a href="http://www.csdn.net/tag/" target="_blank">核心技术类目</a></h5>
    <div class="classify">
<a title="全部主题" href="http://www.csdn.net/tag" target="_blank" onclick="LogClickCount(this,336);">全部主题</a>
<a title="Hadoop" href="http://g.csdn.net/5272865" target="_blank" onclick="LogClickCount(this,336);">Hadoop</a>
<a title="AWS" href="http://g.csdn.net/5272866" target="_blank" onclick="LogClickCount(this,336);">AWS</a>
<a title="移动游戏" href="http://g.csdn.net/5272870" target="_blank" onclick="LogClickCount(this,336);">移动游戏</a>
<a title="Java" href="http://g.csdn.net/5272871" target="_blank" onclick="LogClickCount(this,336);">Java</a>
<a title="Android" href="http://g.csdn.net/5272872" target="_blank" onclick="LogClickCount(this,336);">Android</a>
<a title="iOS" href="http://g.csdn.net/5272873" target="_blank" onclick="LogClickCount(this,336);">iOS</a>
<a title="Swift" href="http://g.csdn.net/5272868" target="_blank" onclick="LogClickCount(this,336);">Swift</a>
<a title="智能硬件" href="http://g.csdn.net/5272869" target="_blank" onclick="LogClickCount(this,336);">智能硬件</a>
<a title="Docker" href="http://g.csdn.net/5272867" target="_blank" onclick="LogClickCount(this,336);">Docker</a>
<a title="OpenStack" href="http://g.csdn.net/5272925" target="_blank" onclick="LogClickCount(this,336);">OpenStack</a>
<a title="VPN" href="http://www.csdn.net/tag/vpn" target="_blank" onclick="LogClickCount(this,336);">VPN</a>
<a title="Spark" href="http://g.csdn.net/5272924" target="_blank" onclick="LogClickCount(this,336);">Spark</a>
<a title="ERP" href="http://www.csdn.net/tag/erp" target="_blank" onclick="LogClickCount(this,336);">ERP</a>
<a title="IE10" href="http://www.csdn.net/tag/ie10" target="_blank" onclick="LogClickCount(this,336);">IE10</a>
<a title="Eclipse" href="http://www.csdn.net/tag/eclipse" target="_blank" onclick="LogClickCount(this,336);">Eclipse</a>
<a title="CRM" href="http://www.csdn.net/tag/crm" target="_blank" onclick="LogClickCount(this,336);">CRM</a>
<a title="JavaScript" href="http://www.csdn.net/tag/javascript" target="_blank" onclick="LogClickCount(this,336);">JavaScript</a>
<a title="数据库" href="http://www.csdn.net/tag/数据库" target="_blank" onclick="LogClickCount(this,336);">数据库</a>
<a title="Ubuntu" href="http://www.csdn.net/tag/ubuntu" target="_blank" onclick="LogClickCount(this,336);">Ubuntu</a>
<a title="NFC" href="http://www.csdn.net/tag/nfc" target="_blank" onclick="LogClickCount(this,336);">NFC</a>
<a title="WAP" href="http://www.csdn.net/tag/wap" target="_blank" onclick="LogClickCount(this,336);">WAP</a>
<a title="jQuery" href="http://www.csdn.net/tag/jquery" target="_blank" onclick="LogClickCount(this,336);">jQuery</a>
<a title="BI" href="http://www.csdn.net/tag/bi" target="_blank" onclick="LogClickCount(this,336);">BI</a>
<a title="HTML5" href="http://www.csdn.net/tag/html5" target="_blank" onclick="LogClickCount(this,336);">HTML5</a>
<a title="Spring" href="http://www.csdn.net/tag/spring" target="_blank" onclick="LogClickCount(this,336);">Spring</a>
<a title="Apache" href="http://www.csdn.net/tag/apache" target="_blank" onclick="LogClickCount(this,336);">Apache</a>
<a title=".NET" href="http://www.csdn.net/tag/.net" target="_blank" onclick="LogClickCount(this,336);">.NET</a>
<a title="API" href="http://www.csdn.net/tag/api" target="_blank" onclick="LogClickCount(this,336);">API</a>
<a title="HTML" href="http://www.csdn.net/tag/html" target="_blank" onclick="LogClickCount(this,336);">HTML</a>
<a title="SDK" href="http://www.csdn.net/tag/sdk" target="_blank" onclick="LogClickCount(this,336);">SDK</a>
<a title="IIS" href="http://www.csdn.net/tag/iis" target="_blank" onclick="LogClickCount(this,336);">IIS</a>
<a title="Fedora" href="http://www.csdn.net/tag/fedora" target="_blank" onclick="LogClickCount(this,336);">Fedora</a>
<a title="XML" href="http://www.csdn.net/tag/xml" target="_blank" onclick="LogClickCount(this,336);">XML</a>
<a title="LBS" href="http://www.csdn.net/tag/lbs" target="_blank" onclick="LogClickCount(this,336);">LBS</a>
<a title="Unity" href="http://www.csdn.net/tag/unity" target="_blank" onclick="LogClickCount(this,336);">Unity</a>
<a title="Splashtop" href="http://www.csdn.net/tag/splashtop" target="_blank" onclick="LogClickCount(this,336);">Splashtop</a>
<a title="UML" href="http://www.csdn.net/tag/uml" target="_blank" onclick="LogClickCount(this,336);">UML</a>
<a title="components" href="http://www.csdn.net/tag/components" target="_blank" onclick="LogClickCount(this,336);">components</a>
<a title="Windows Mobile" href="http://www.csdn.net/tag/windowsmobile" target="_blank" onclick="LogClickCount(this,336);">Windows Mobile</a>
<a title="Rails" href="http://www.csdn.net/tag/rails" target="_blank" onclick="LogClickCount(this,336);">Rails</a>
<a title="QEMU" href="http://www.csdn.net/tag/qemu" target="_blank" onclick="LogClickCount(this,336);">QEMU</a>
<a title="KDE" href="http://www.csdn.net/tag/kde" target="_blank" onclick="LogClickCount(this,336);">KDE</a>
<a title="Cassandra" href="http://www.csdn.net/tag/cassandra" target="_blank" onclick="LogClickCount(this,336);">Cassandra</a>
<a title="CloudStack" href="http://www.csdn.net/tag/cloudstack" target="_blank" onclick="LogClickCount(this,336);">CloudStack</a>
<a title="FTC" href="http://www.csdn.net/tag/ftc" target="_blank" onclick="LogClickCount(this,336);">FTC</a>
<a title="coremail" href="http://www.csdn.net/tag/coremail" target="_blank" onclick="LogClickCount(this,336);">coremail</a>
<a title="OPhone " href="http://www.csdn.net/tag/ophone " target="_blank" onclick="LogClickCount(this,336);">OPhone </a>
<a title="CouchBase" href="http://www.csdn.net/tag/couchbase" target="_blank" onclick="LogClickCount(this,336);">CouchBase</a>
<a title="云计算" href="http://www.csdn.net/tag/云计算" target="_blank" onclick="LogClickCount(this,336);">云计算</a>
<a title="iOS6" href="http://www.csdn.net/tag/iOS6" target="_blank" onclick="LogClickCount(this,336);">iOS6</a>
<a title="Rackspace " href="http://www.csdn.net/tag/rackspace " target="_blank" onclick="LogClickCount(this,336);">Rackspace </a>
<a title="Web App" href="http://www.csdn.net/tag/webapp" target="_blank" onclick="LogClickCount(this,336);">Web App</a>
<a title="SpringSide" href="http://www.csdn.net/tag/springside" target="_blank" onclick="LogClickCount(this,336);">SpringSide</a>
<a title="Maemo" href="http://www.csdn.net/tag/maemo" target="_blank" onclick="LogClickCount(this,336);">Maemo</a>
<a title="Compuware" href="http://www.csdn.net/tag/compuware" target="_blank" onclick="LogClickCount(this,336);">Compuware</a>
<a title="大数据" href="http://www.csdn.net/tag/大数据" target="_blank" onclick="LogClickCount(this,336);">大数据</a>
<a title="aptech" href="http://www.csdn.net/tag/aptech" target="_blank" onclick="LogClickCount(this,336);">aptech</a>
<a title="Perl" href="http://www.csdn.net/tag/perl" target="_blank" onclick="LogClickCount(this,336);">Perl</a>
<a title="Tornado" href="http://www.csdn.net/tag/tornado" target="_blank" onclick="LogClickCount(this,336);">Tornado</a>
<a title="Ruby" href="http://www.csdn.net/tag/ruby" target="_blank" onclick="LogClickCount(this,336);">Ruby</a>
<a title="Hibernate" href="http://www.csdn.net/tag/hibernate" target="_blank" onclick="LogClickCount(this,336);">Hibernate</a>
<a title="ThinkPHP" href="http://www.csdn.net/tag/thinkphp" target="_blank" onclick="LogClickCount(this,336);">ThinkPHP</a>
<a title="HBase" href="http://www.csdn.net/tag/hbase" target="_blank" onclick="LogClickCount(this,336);">HBase</a>
<a title="Pure" href="http://www.csdn.net/tag/pure" target="_blank" onclick="LogClickCount(this,336);">Pure</a>
<a title="Solr" href="http://www.csdn.net/tag/solr" target="_blank" onclick="LogClickCount(this,336);">Solr</a>
<a title="Angular" href="http://www.csdn.net/tag/angular" target="_blank" onclick="LogClickCount(this,336);">Angular</a>
<a title="Cloud Foundry" href="http://www.csdn.net/tag/cloudfoundry" target="_blank" onclick="LogClickCount(this,336);">Cloud Foundry</a>
<a title="Redis" href="http://www.csdn.net/tag/redis" target="_blank" onclick="LogClickCount(this,336);">Redis</a>
<a title="Scala" href="http://www.csdn.net/tag/scala" target="_blank" onclick="LogClickCount(this,336);">Scala</a>
<a title="Django" href="http://www.csdn.net/tag/django" target="_blank" onclick="LogClickCount(this,336);">Django</a>
<a title="Bootstrap" href="http://www.csdn.net/tag/bootstrap" target="_blank" onclick="LogClickCount(this,336);">Bootstrap</a>
    </div>


</div>
  <script type="text/javascript">     
      $(function(){
              setTimeout(function(){
                  $.get("/lz99770337/svc/GetTagContent",function(data){
                      $(".tag_list").html(data).show();
                  });     
              });
          },500);                       
 </script> 




<div id="pop_win" style="display:none ;position: absolute; z-index: 10000; border: 1px solid rgb(220, 220, 220); top: 222.5px; left: 630px; opacity: 1; background: none 0px 0px repeat scroll rgb(255, 255, 255);">
    
</div>
<div id="popup_mask"></div>
<style>
    #popup_mask
    {
        position: absolute;
        width: 100%;
        height: 100%;
        background: #000;
        z-index: 9999;
        left: 0px;
        top: 0px;
        opacity: 0.3;
        filter: alpha(opacity=30);
        display: none;
    }


</style>








<script type="text/javascript">
    $(function(){        
        
        setTimeout(function(){
            $(".comment_body:contains('回复')").each(function(index,item){
                var u=$(this).text().split(':')[0].toString().replace("回复","")
                var thisComment=$(this);
                if(u)
                {
                    $.getJSON("https://passport.csdn.net/get/nick?callback=?", {users: u}, function(a) {
                        if(a!=null&&a.data!=null&&a.data.length>0)
                        {
                            nick=a.data[0].n; 
                            if(u!=nick)
                            {
                                thisComment.text(thisComment.text().replace(u,nick));  
                            }
                        }       
                    });  
                }
            });         


        },200);  


        setTimeout(function(){
            $(".math").each(function(index,value){$(this).find("span").last().css("color","#fff"); })
        },5000);


        setTimeout(function(){
            $(".math").each(function(index,value){$(this).find("span").last().css("color","#fff"); })
        },10000);


        setTimeout(function(){
            $(".math").each(function(index,value){$(this).find("span").last().css("color","#fff"); })
        },15000);
        
        setTimeout(function(){
            $("a img[src='http://js.tongji.linezing.com/stats.gif']").parent().css({"position":"absolute","left":"50%"});
        },300);
    });


    function loginbox(){
        var $logpop=$("#pop_win");
        $logpop.html('<iframe src="https://passport.csdn.net/account/loginbox?service=http://static.blog.csdn.net/callback.htm" frameborder="0" height="600" width="400" scrolling="no"></iframe>');


        $('#popup_mask').css({
            opacity: 0.5,
            width: $( document ).width() + 'px',
            height:  $( document ).height() + 'px'
        });
        $('#popup_mask').css("display","block");
 
        $logpop.css( {
            top: ($( window ).height() - $logpop.height())/ 2  + $( window 
       ).scrollTop() + 'px',
            left:($( window ).width() - $logpop.width())/ 2
        } );
 
        setTimeout( function () {
            $logpop.show();
            $logpop.css( {
                opacity: 1
            } );
        }, 200 );
 
        $('#popup_mask').unbind("click");
        $('#popup_mask').bind("click", function(){
            $('#popup_mask').hide();
            var $clopop = $("#pop_win");
            $("#common_ask_div_sc").css("display","none");
            $clopop.css( {
                opacity: 0
            } );
            setTimeout( function () {
                $clopop.hide();
            }, 350 );
            return false;
        });
    }   


    var articletitle='SystemUI源码分析';


</script>
















                        <div class="clear">
                        </div>
                    </div>                   
                
            </div>
阅读全文
0 0
原创粉丝点击