创建的入口在
frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/Statusbar.java
frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/NavigationBarController.java
Statusbar的makeStatusBarView函数中调用createNavigationBar函数最后调用到NavigationBarController的createNavigationBars
frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java
看 NavigationBarFragment 的create方法,是WindowManager去addView了导航栏的布局,最终add了fragment的onCreateView加载的布局navigation_bar.xml,xml中是自定义布局继续跟代码frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java
看onFinishInflate()方法,这是view的生命周期,每个view被inflate之后都会回调。看inflateLayout():里面的newLayout参数很重要!!!根据上一个方法看到getDefaultLayout(),他return了一个在xml写死的字符串。再看inflateLayout方法,他解析分割了xml里配置的config_navBarLayout字符串,并传给了inflateButtons方法.看inflateButtons()方法,遍历加载inflateButton.调到createView()方法,通过字符串匹配布局,以home按键为例,加载了home的button,其实是加载了 R.layout.home 的layout布局
frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java
KeyButtonView通过sendEvent()方法,back等view的点击touch事件交由系统以实体按键(keycode)的形式处理的.当然KeyButtonView类还处理了支持长按的button,按键的响声等.
导航键的图标由NavigationBarFragment的onConfigurationChanged()方法 和 NavigationBarView的onAttachedToWindow()和onSizeChanged()方法更新。在NavigationBarView导航栏这个布局加载的时候就会设置图片资源,和长度改变,屏幕旋转都有可能引起重新设置