原创文章,转载请注明出处:http://blog.csdn.net/ruils/article/details/17324397
SystemUI即Android系统的UI界面。手机厂商需要深度定制Android系统的UI界面就需要修改这里面的东西,比如双卡手机,就需要在状态栏增加手机状态图标。
SystemUI包括:
StatusBar, 状态栏,最上面那一排
NavigationBar, 导航栏,最下面那一排虚拟键,有Back键,Home键,Recents键(最近使用程序列表键)
Recent APP List,最近使用程序列表界面
Wallpaper, 壁纸
USB相关界面
其他等。
SystemUI所在目录为frameworks/base/packages/SystemUI,从Android4.0以后的版本,SystemUI编译都会生成SystemUI.apk。
SystemUI在SystemServer中被启动:
frameworks/base/services/java/com/android/server/SystemServer.java
if (!headless) startSystemUi(contextF);
startSystemUi方法:
static final void startSystemUi(Context context) {
Intent intent = new Intent();
intent.setComponent(new ComponentName("com.android.systemui",
"com.android.systemui.SystemUIService"));
//Slog.d(TAG, "Starting service: " + intent);
context.startServiceAsUser(intent, UserHandle.OWNER);
}
frameworks/base/packages/SystemUI/src/com/android/systemui/SystemUIService.java
SystemUIService的Oncreate方法:
@Override
public void onCreate() {
// Tell the accessibility layer that this process will
// run as the current user, i.e. run across users.
AccessibilityManager.createAsSharedAcrossUsers(this);
// Pick status bar or system bar.
IWindowManager wm = WindowManagerGlobal.getWindowManagerService();
try {
SERVICES[0] = wm.hasSystemNavBar()
? R.string.config_systemBarComponent
: R.string.config_statusBarComponent;
} catch (RemoteException e) {
Slog.w(TAG, "Failing checking whether status bar can hide", e);
}
final int N = SERVICES.length;
mServices = new SystemUI[N];
for (int i=0; i
final Object[] SERVICES = new Object[] {
0, // system bar or status bar, filled in below.
com.android.systemui.power.PowerUI.class,
com.android.systemui.media.RingtonePlayer.class,
com.android.systemui.settings.SettingsUI.class,
};
// Pick status bar or system bar.
IWindowManager wm = WindowManagerGlobal.getWindowManagerService();
try {
SERVICES[0] = wm.hasSystemNavBar()
? R.string.config_systemBarComponent
: R.string.config_statusBarComponent;
} catch (RemoteException e) {
Slog.w(TAG, "Failing checking whether status bar can hide", e);
}
frameworks/base/packages/SystemUI/res/values/config.xml
com.android.systemui.statusbar.phone.PhoneStatusBar
com.android.systemui.statusbar.tablet.TabletStatusBar
这里一个是手机的StatusBar一个是平板的StatusBar。
我们看手机的StatusBar,
frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
PhoneStatusBar的start()方法: @Override
public void start() {
mDisplay = ((WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE))
.getDefaultDisplay();
mDreamManager = IDreamManager.Stub.asInterface(
ServiceManager.checkService(DreamService.DREAM_SERVICE));
super.start(); // calls createAndAddWindows()
addNavigationBar();
if (ENABLE_INTRUDERS) addIntruderView();
// Lastly, call to the icon policy to install/update all the icons.
mIconPolicy = new PhoneStatusBarPolicy(mContext);
}
这里主要做了三件事:
1.将StatusBar添加到WindowManager中
在super.start()方法中调用createAndAddWindows()方法,
@Override
public void createAndAddWindows() {
addStatusBarWindow();
}
private void addStatusBarWindow() {
// Put up the view
final int height = getStatusBarHeight();
// Now that the status bar window encompasses the sliding panel and its
// translucent backdrop, the entire thing is made TRANSLUCENT and is
// hardware-accelerated.
final WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
height,
WindowManager.LayoutParams.TYPE_STATUS_BAR,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING
| WindowManager.LayoutParams.FLAG_SPLIT_TOUCH,
PixelFormat.TRANSLUCENT);
lp.flags |= WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED;
lp.gravity = getStatusBarGravity();
lp.setTitle("StatusBar");
lp.packageName = mContext.getPackageName();
makeStatusBarView();
mWindowManager.addView(mStatusBarWindow, lp);
}
addNavigationBar()
// For small-screen devices (read: phones) that lack hardware navigation buttons
private void addNavigationBar() {
if (DEBUG) Slog.v(TAG, "addNavigationBar: about to add " + mNavigationBarView);
if (mNavigationBarView == null) return;
prepareNavigationBarView();
mWindowManager.addView(mNavigationBarView, getNavigationBarLayoutParams());
}