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>
<a href=" http://blog.csdn.net/turingbooks/article/details/72416875" target="_blank">
<font color="red"><strong>【评论送书】5月书讯:流畅的Python </strong></font></a>
<a href="http://blog.csdn.net/blogdevteam/article/details/72844981" target="_blank">
<font color="blue"><strong>CSDN日报20170602 ——《程序员、技术主管和架构师》
</strong></font></a>
<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="{"err":0,"msg":"ok","data":[]}"></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 + " ";
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”> <br>
……………………………………… <br>
android:exported=”true” <br>
/> <br>
android:process=”:screenshot” <br>
android:exported=”false” /> <br>
android:exported=”true” /> <br>
android:permission=”android.permission.BIND_WALLPAPER” <br>
android:exported=”true” /> <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<N; i++) {
Class<?> 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>
<-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”> <br>
………………………….. <br>
<-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” /></p>
<pre><code><include layout="@layout/status_bar"
android:layout_width="match_parent"
android:layout_height="@dimen/status_bar_height" />
</code></pre>
<p>…………………………………… <br>
<-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” > <br>
<-include layout=”@layout/status_bar_expanded” <br>
android:layout_width=”match_parent” <br>
android:layout_height=”match_parent” <br>
android:visibility=”gone” /> <br>
<-/com.android.systemui.statusbar.phone.PanelHolder> <br>
在这里,我们主要注意上面所示status_bar / panel_holder才是我们要关注的重中之重,是我们整个view的最直观的显示,也是客户化定制比较多的地方,下面我们来进行进一步的细分。</p>
<p>1.5 frameworks/base/packages/SystemUI/res/layout/status_bar.xml</p>
<p><-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 > <br>
……………………………… <br>
71 <-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”/> <br>
77 <-/com.android.keyguard.AlphaOptimizedLinearLayout> <br>
78 <-/com.android.systemui.statusbar.AlphaOptimizedFrameLayout> <br>
79 <br>
80 <-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 > <br>
85 <br>
86 <-include layout=”@layout/system_icons” /> <br>
87 <br>
88 <-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 /> <br>
97 <-/com.android.keyguard.AlphaOptimizedLinearLayout> <br>
98 <-/LinearLayout></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><-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 > <br>
29 <br>
30 <-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 /> <br>
37 <br>
38 <-include <br>
39 layout=”@layout/keyguard_status_view” <br>
40 android:layout_height=”wrap_content” <br>
41 android:visibility=”gone” /> <br>
42 <br>
43 <-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 /> <br>
52 <br>
53 <-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”> <br>
60 <br>
<-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”> <br>
69 <-LinearLayout <br>
70 android:layout_width=”match_parent” <br>
71 android:layout_height=”wrap_content” <br>
72 android:orientation=”vertical”> <br>
73 <-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”/> <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 <-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” /> <br>
88 <br>
89 <-View <br>
90 android:layout_height=”@dimen/notification_side_padding” <br>
91 android:layout_width=”match_parent” /> <br>
92 <-/LinearLayout> <br>
93 <-/com.android.systemui.statusbar.phone.ObservableScrollView> <br>
94 <br>
95 <-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” /> <br>
103 <br>
104 <-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” /> <br>
109 <br>
110 <-include <br>
111 layout=”@layout/keyguard_status_bar” <br>
112 android:visibility=”invisible” /> <br>
113 <br>
114 <-/com.android.systemui.statusbar.phone.NotificationsQuickSettingsContainer> <br>
115 <br>
116 <-include <br>
117 layout=”@layout/keyguard_bottom_area” <br>
118 android:visibility=”gone” /> <br>
119 <br>
120 <-include layout=”@layout/status_bar_expanded_header” /> <br>
121 <br>
122 <-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” /> <br>
129 <br>
130 <-/com.android.systemui.statusbar.phone.NotificationPanelView><!-- 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>
<-include layout=”@layout/status_bar_expanded_header” /> <br>
到了这里,我们就不继续对status_bar_expanded_header.xml这个文件进行分析了,进入到该文件中,我们能清楚明白的看到各个id的应用。</p>
<p>下面我们继续看最地下的通知信息栏是在哪里加载的,如下如所示: <br>
<img src="http://img.blog.csdn.net/20150717105733575" alt="这里写图片描述" title=""> <br>
在这里,该部分内容是在 <br>
<-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” /> <br>
这里进行添加的,我们可以看到otification_stack_scroller其实在这个效果图里面是没有展开的,而是重叠在一起的,但是我们在这里不进行进一步的分析。</p>
<p>现在,我们来看最后一部分内容,就是快捷键的使用,我们先看下效果图,如下: <br>
<img src="http://img.blog.csdn.net/20150717110301903" alt="这里写图片描述" title=""> <br>
通过android:id的定位,我们知道,该部分内容是在这里 <br>
<-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”> <br>
69 <-LinearLayout <br>
70 android:layout_width=”match_parent” <br>
71 android:layout_height=”wrap_content” <br>
72 android:orientation=”vertical”> <br>
73 <-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”/> <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 <-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” /> <br>
88 <br>
89 <-View <br>
90 android:layout_height=”@dimen/notification_side_padding” <br>
91 android:layout_width=”match_parent” /> <br>
92 <-/LinearLayout> <br>
93 <-/com.android.systemui.statusbar.phone.ObservableScrollView> <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 <<>> <br>
android:id=”@+id/brightness_slider” <br>
2 109 frameworks/base/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java <<>> <br>
(ToggleSlider) findViewById(R.id.brightness_slider)); <br>
3 126 frameworks/base/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java <<>> <br>
ToggleSlider brightnessSlider = (ToggleSlider) findViewById(R.id.brightness_slider); <br>
4 127 frameworks/base/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java <<>> <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 <<>> <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 <> <br>
R.layout.quick_settings_brightness_dialog, this, false); <br>
2 48 frameworks/base/packages/SystemUI/src/com/android/systemui/settings/BrightnessDialog.java <> <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&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"> </a> </div>
<div class="tracking-ad" data-mod="popu_223"> <a href="javascript:void(0);" target="_blank"> </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">
相关文章推荐
</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&dc=3&di=u2843949&dri=0&dis=0&dai=1&ps=18337x656&dcb=___adblockplus&dtm=HTML_POST&dvi=0.0&dci=-1&dpt=none&tsr=0&tpr=1496633161086&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&ari=2&dbv=2&drs=1&pcs=1850x965&pss=1850x18355&cfv=0&cpl=5&chi=1&cce=true&cec=UTF-8&tlm=1496633161&rw=965&ltu=http%3A%2F%2Fblog.csdn.net%2Flz99770337%2Farticle%2Fdetails%2F46890239&ltr=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DtTckok-p-vdiLd7Odffw9oQ_sBM-CY0GfZUzSvKw1HEgBb79642TAWTsC_1F9jLSMf_lZYn1DKNs4zBkuoBTKh4OJqQ7_ZL5_dB6WBmskXG%26wd%3D%26eqid%3Ddbf0082600024594000000035934cf45&ecd=1&uc=1865x1056&pis=-1x-1&sr=1920x1080&tcn=1496633161&qn=15af5cd4d79adba8&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&dc=3&di=u1607657&dri=0&dis=0&dai=2&ps=18519x656&dcb=___adblockplus&dtm=HTML_POST&dvi=0.0&dci=-1&dpt=none&tsr=0&tpr=1496633161086&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&ari=2&dbv=2&drs=1&pcs=1850x965&pss=1850x18537&cfv=0&cpl=5&chi=1&cce=true&cec=UTF-8&tlm=1496633161&rw=965&ltu=http%3A%2F%2Fblog.csdn.net%2Flz99770337%2Farticle%2Fdetails%2F46890239&ltr=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DtTckok-p-vdiLd7Odffw9oQ_sBM-CY0GfZUzSvKw1HEgBb79642TAWTsC_1F9jLSMf_lZYn1DKNs4zBkuoBTKh4OJqQ7_ZL5_dB6WBmskXG%26wd%3D%26eqid%3Ddbf0082600024594000000035934cf45&ecd=1&uc=1865x1056&pis=-1x-1&sr=1920x1080&tcn=1496633161&qn=f03d7c767086294d&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&dc=3&di=u2895327&dri=0&dis=0&dai=3&ps=965x1826&dcb=___adblockplus&dtm=HTML_POST&dvi=0.0&dci=-1&dpt=none&tsr=0&tpr=1496633161086&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&ari=2&dbv=2&drs=1&pcs=1850x965&pss=1850x18627&cfv=0&cpl=5&chi=1&cce=true&cec=UTF-8&tlm=1496633161&rw=965&ltu=http%3A%2F%2Fblog.csdn.net%2Flz99770337%2Farticle%2Fdetails%2F46890239&ltr=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DtTckok-p-vdiLd7Odffw9oQ_sBM-CY0GfZUzSvKw1HEgBb79642TAWTsC_1F9jLSMf_lZYn1DKNs4zBkuoBTKh4OJqQ7_ZL5_dB6WBmskXG%26wd%3D%26eqid%3Ddbf0082600024594000000035934cf45&ecd=1&uc=1865x1056&pis=-1x-1&sr=1920x1080&tcn=1496633161&qn=2b8850c3fa248e2d&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="提交"> <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>
<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>
<a href=" http://blog.csdn.net/turingbooks/article/details/72416875" target="_blank">
<font color="red"><strong>【评论送书】5月书讯:流畅的Python </strong></font></a>
<a href="http://blog.csdn.net/blogdevteam/article/details/72844981" target="_blank">
<font color="blue"><strong>CSDN日报20170602 ——《程序员、技术主管和架构师》
</strong></font></a>
<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="{"err":0,"msg":"ok","data":[]}"></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 + " ";
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”> <br>
……………………………………… <br>
android:exported=”true” <br>
/> <br>
android:process=”:screenshot” <br>
android:exported=”false” /> <br>
android:exported=”true” /> <br>
android:permission=”android.permission.BIND_WALLPAPER” <br>
android:exported=”true” /> <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<N; i++) {
Class<?> 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>
<-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”> <br>
………………………….. <br>
<-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” /></p>
<pre><code><include layout="@layout/status_bar"
android:layout_width="match_parent"
android:layout_height="@dimen/status_bar_height" />
</code></pre>
<p>…………………………………… <br>
<-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” > <br>
<-include layout=”@layout/status_bar_expanded” <br>
android:layout_width=”match_parent” <br>
android:layout_height=”match_parent” <br>
android:visibility=”gone” /> <br>
<-/com.android.systemui.statusbar.phone.PanelHolder> <br>
在这里,我们主要注意上面所示status_bar / panel_holder才是我们要关注的重中之重,是我们整个view的最直观的显示,也是客户化定制比较多的地方,下面我们来进行进一步的细分。</p>
<p>1.5 frameworks/base/packages/SystemUI/res/layout/status_bar.xml</p>
<p><-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 > <br>
……………………………… <br>
71 <-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”/> <br>
77 <-/com.android.keyguard.AlphaOptimizedLinearLayout> <br>
78 <-/com.android.systemui.statusbar.AlphaOptimizedFrameLayout> <br>
79 <br>
80 <-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 > <br>
85 <br>
86 <-include layout=”@layout/system_icons” /> <br>
87 <br>
88 <-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 /> <br>
97 <-/com.android.keyguard.AlphaOptimizedLinearLayout> <br>
98 <-/LinearLayout></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><-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 > <br>
29 <br>
30 <-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 /> <br>
37 <br>
38 <-include <br>
39 layout=”@layout/keyguard_status_view” <br>
40 android:layout_height=”wrap_content” <br>
41 android:visibility=”gone” /> <br>
42 <br>
43 <-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 /> <br>
52 <br>
53 <-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”> <br>
60 <br>
<-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”> <br>
69 <-LinearLayout <br>
70 android:layout_width=”match_parent” <br>
71 android:layout_height=”wrap_content” <br>
72 android:orientation=”vertical”> <br>
73 <-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”/> <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 <-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” /> <br>
88 <br>
89 <-View <br>
90 android:layout_height=”@dimen/notification_side_padding” <br>
91 android:layout_width=”match_parent” /> <br>
92 <-/LinearLayout> <br>
93 <-/com.android.systemui.statusbar.phone.ObservableScrollView> <br>
94 <br>
95 <-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” /> <br>
103 <br>
104 <-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” /> <br>
109 <br>
110 <-include <br>
111 layout=”@layout/keyguard_status_bar” <br>
112 android:visibility=”invisible” /> <br>
113 <br>
114 <-/com.android.systemui.statusbar.phone.NotificationsQuickSettingsContainer> <br>
115 <br>
116 <-include <br>
117 layout=”@layout/keyguard_bottom_area” <br>
118 android:visibility=”gone” /> <br>
119 <br>
120 <-include layout=”@layout/status_bar_expanded_header” /> <br>
121 <br>
122 <-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” /> <br>
129 <br>
130 <-/com.android.systemui.statusbar.phone.NotificationPanelView><!-- 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>
<-include layout=”@layout/status_bar_expanded_header” /> <br>
到了这里,我们就不继续对status_bar_expanded_header.xml这个文件进行分析了,进入到该文件中,我们能清楚明白的看到各个id的应用。</p>
<p>下面我们继续看最地下的通知信息栏是在哪里加载的,如下如所示: <br>
<img src="http://img.blog.csdn.net/20150717105733575" alt="这里写图片描述" title=""> <br>
在这里,该部分内容是在 <br>
<-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” /> <br>
这里进行添加的,我们可以看到otification_stack_scroller其实在这个效果图里面是没有展开的,而是重叠在一起的,但是我们在这里不进行进一步的分析。</p>
<p>现在,我们来看最后一部分内容,就是快捷键的使用,我们先看下效果图,如下: <br>
<img src="http://img.blog.csdn.net/20150717110301903" alt="这里写图片描述" title=""> <br>
通过android:id的定位,我们知道,该部分内容是在这里 <br>
<-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”> <br>
69 <-LinearLayout <br>
70 android:layout_width=”match_parent” <br>
71 android:layout_height=”wrap_content” <br>
72 android:orientation=”vertical”> <br>
73 <-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”/> <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 <-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” /> <br>
88 <br>
89 <-View <br>
90 android:layout_height=”@dimen/notification_side_padding” <br>
91 android:layout_width=”match_parent” /> <br>
92 <-/LinearLayout> <br>
93 <-/com.android.systemui.statusbar.phone.ObservableScrollView> <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 <<>> <br>
android:id=”@+id/brightness_slider” <br>
2 109 frameworks/base/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java <<>> <br>
(ToggleSlider) findViewById(R.id.brightness_slider)); <br>
3 126 frameworks/base/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java <<>> <br>
ToggleSlider brightnessSlider = (ToggleSlider) findViewById(R.id.brightness_slider); <br>
4 127 frameworks/base/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java <<>> <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 <<>> <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 <> <br>
R.layout.quick_settings_brightness_dialog, this, false); <br>
2 48 frameworks/base/packages/SystemUI/src/com/android/systemui/settings/BrightnessDialog.java <> <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&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"> </a> </div>
<div class="tracking-ad" data-mod="popu_223"> <a href="javascript:void(0);" target="_blank"> </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">
相关文章推荐
</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&dc=3&di=u2843949&dri=0&dis=0&dai=1&ps=18337x656&dcb=___adblockplus&dtm=HTML_POST&dvi=0.0&dci=-1&dpt=none&tsr=0&tpr=1496633161086&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&ari=2&dbv=2&drs=1&pcs=1850x965&pss=1850x18355&cfv=0&cpl=5&chi=1&cce=true&cec=UTF-8&tlm=1496633161&rw=965&ltu=http%3A%2F%2Fblog.csdn.net%2Flz99770337%2Farticle%2Fdetails%2F46890239&ltr=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DtTckok-p-vdiLd7Odffw9oQ_sBM-CY0GfZUzSvKw1HEgBb79642TAWTsC_1F9jLSMf_lZYn1DKNs4zBkuoBTKh4OJqQ7_ZL5_dB6WBmskXG%26wd%3D%26eqid%3Ddbf0082600024594000000035934cf45&ecd=1&uc=1865x1056&pis=-1x-1&sr=1920x1080&tcn=1496633161&qn=15af5cd4d79adba8&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&dc=3&di=u1607657&dri=0&dis=0&dai=2&ps=18519x656&dcb=___adblockplus&dtm=HTML_POST&dvi=0.0&dci=-1&dpt=none&tsr=0&tpr=1496633161086&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&ari=2&dbv=2&drs=1&pcs=1850x965&pss=1850x18537&cfv=0&cpl=5&chi=1&cce=true&cec=UTF-8&tlm=1496633161&rw=965&ltu=http%3A%2F%2Fblog.csdn.net%2Flz99770337%2Farticle%2Fdetails%2F46890239&ltr=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DtTckok-p-vdiLd7Odffw9oQ_sBM-CY0GfZUzSvKw1HEgBb79642TAWTsC_1F9jLSMf_lZYn1DKNs4zBkuoBTKh4OJqQ7_ZL5_dB6WBmskXG%26wd%3D%26eqid%3Ddbf0082600024594000000035934cf45&ecd=1&uc=1865x1056&pis=-1x-1&sr=1920x1080&tcn=1496633161&qn=f03d7c767086294d&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&dc=3&di=u2895327&dri=0&dis=0&dai=3&ps=965x1826&dcb=___adblockplus&dtm=HTML_POST&dvi=0.0&dci=-1&dpt=none&tsr=0&tpr=1496633161086&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&ari=2&dbv=2&drs=1&pcs=1850x965&pss=1850x18627&cfv=0&cpl=5&chi=1&cce=true&cec=UTF-8&tlm=1496633161&rw=965&ltu=http%3A%2F%2Fblog.csdn.net%2Flz99770337%2Farticle%2Fdetails%2F46890239&ltr=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DtTckok-p-vdiLd7Odffw9oQ_sBM-CY0GfZUzSvKw1HEgBb79642TAWTsC_1F9jLSMf_lZYn1DKNs4zBkuoBTKh4OJqQ7_ZL5_dB6WBmskXG%26wd%3D%26eqid%3Ddbf0082600024594000000035934cf45&ecd=1&uc=1865x1056&pis=-1x-1&sr=1920x1080&tcn=1496633161&qn=2b8850c3fa248e2d&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="提交"> <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
- http://blog.csdn.net/lz99770337/article/details/46890239
- http://blog.csdn.net/IBM_hoojo/article/details/5688947
- http://blog.csdn.net/chenlaic/article/details/6143235
- http://blog.csdn.net/eaglewood2005/article/details/4335052
- http://blog.csdn.net/mchp/article/details/3995970
- http://blog.csdn.net/v_july_v/article/details/6015165
- http://blog.csdn.net/masterz/article/details/6232585
- http://blog.csdn.net/perfectpdl/article/details/6442847
- http://blog.csdn.net/eroswang/article/details/1967243
- http://blog.csdn.net/zhvsby/article/details/5986645
- http://blog.csdn.net/dz45693/article/details/6183645
- http://blog.csdn.net/david_lv/article/details/5798003
- http://blog.csdn.net/zxingchao2009/article/details/6299313
- http://blog.csdn.net/zhanxinhang/article/details/6783766
- http://blog.csdn.net/ruanruoshi/article/details/935510
- http://blog.csdn.net/yming0221/article/details/6538527
- http://blog.csdn.net/yming0221/article/details/6528490
- http://blog.csdn.net/yming0221/article/details/6704079
- SUBLIME 3 支持中文设置
- java用poi生成excel
- centos nginx上搭建服务器
- Gate 7.2的学习笔记(一)
- 击败Facebook Infer!360火线大起底
- http://blog.csdn.net/lz99770337/article/details/46890239
- 股市操作心得--价值投机
- Android短信相关
- White Paper: Red Hat Crash Utility
- 习题25
- nginx 搭建https服务器
- Python学习笔记(一)——Anaconda安装与配置(windows)
- 如何从业余爱好者自学进阶成专业开发者
- 转:问题解决:The project cannot be built until build path errors are resolved