SystemUI初始化加载流程

来源:互联网 发布:p2p网络推广方案ppt 编辑:程序博客网 时间:2024/06/08 03:38

1.1System启动,ActivityManagerService在systemReady时启动SystemUIService:

 

frameworks\base\services\java\com\android\server\SystemServer.java

   public static void main(String[] args) {

       new SystemServer().run();

}

àstartOtherServices();

 

àmActivityManagerService.systemReady(new Runnable()

 

à static final void startSystemUi(Context context) {

       Intent intent = new Intent();

       intent.setComponent(newComponentName("com.android.systemui",

                   "com.android.systemui.SystemUIService"));

       //Slog.d(TAG, "Starting service: " + intent);

       context.startServiceAsUser(intent, UserHandle.OWNER);

}

 

1.2SystemUIService启动后会启动SystemUI的各个子模块并进行初始化:

frameworks\base\packages\SystemUI\src\com\android\systemui\SystemUIService.java

 

àonCreate()

 

à((SystemUIApplication) getApplication()).startServicesIfNeeded();

跟普通应用一样SystemUIService被启动时会创建SystemUIService所属的Application,在这里就是SystemUIApplication。

 

à startServicesIfNeeded()会启动SERVICES数组里的的服务:

   private final Class<?>[] SERVICES = new Class[] {

           com.android.systemui.tuner.TunerService.class,

           com.android.systemui.keyguard.KeyguardViewMediator.class,

           com.android.systemui.recents.Recents.class,

           com.android.systemui.volume.VolumeUI.class,

           com.android.systemui.statusbar.SystemBars.class,

           com.android.systemui.usb.StorageNotification.class,

           com.android.systemui.power.PowerUI.class,

           com.android.systemui.media.RingtonePlayer.class,

};

这些服务并不是真正的Services,只是每一个都管理着SystemUI的一部分,他们继承自com/android/systemui/SystemUI.java

 

à调用各个SystemUI的start()

 

1.3状态栏的启动流程

 

à com.android.systemui.statusbar.SystemBars.class:start()

SystemBars:start()会new一个ServiceMonitor并去真正启动一个的状态栏管理服务。

 

à com.android.systemui.statusbar.SystemBars.class: onNoService ()

第一次服务还没启动时,会回调回来到onNoService (),然后开始创建一个新的状态栏。

 

à com.android.systemui.statusbar.SystemBars.class:createStatusBarFromConfig ()

读取一个写在Resource的String配置,用ClassLoader创建一个新的状态栏实例。

 

final String clsName =mContext.getString(R.string.config_statusBarComponent);

其中config_statusBarComponent为:

<string name="config_statusBarComponent"translatable="false">com.android.systemui.statusbar.phone.PhoneStatusBar</string>

 

à com.android.systemui.statusbar.phone.PhoneStatusBar:strart()

PhoneStatusBar就是真正管理着SystemUI中状态栏部分的类,职能类似于Activity,管理着UI和业务。

 

在PhoneStatusBar:strart()中会进行很多东西的初始化,其中最重要的是:

à com/android/systemui/statusbar/BaseStatusBar.java:start()

调用父类BaseStatusBar的start(),里面也是各种初始化,最主要的就是调用了createAndAddWindows()

 

*** 远程服务通信 mBarService =IStatusBarService.Stub.asInterface(

               ServiceManager.getService(Context.STATUS_BAR_SERVICE));   

com.android.server.statusbar.StatusBarManagerServiceextendsIStatusBarService.Stub

 

mBarService.registerStatusBar(mCommandQueue,iconList, switches, binders);

com.android.systemui.statusbar.CommandQueueextends IStatusBar.Stub

CommandQueue&CallbacksBaseStatusBar实现的重要接口,包括setSystemUiVisibility等重要方法 ***

 

à PhoneStatusBar: createAndAddWindows()

createAndAddWindows()是个抽象方法,PhoneStatusBar实现了它。

 

à PhoneStatusBar: addStatusBarWindow ()

这个方法就是向窗口服务申请一个类型为TYPE_STATUS_BAR的Window并插入到窗口栈中。

 

à PhoneStatusBar: makeStatusBarView ()

首先先初始化View,加载布局R.layout.super_status_bar,View的根为一个StatusBarWindowView类型的自定义View。生成StatusBarWindowView后还会去获取各个子View的引用,对子View进行初始化,对子View设置监听等。

 

 

1.      取消从应用进入动画

Recents. startRecentsActivity()

if(useThumbnailTransition) {

            // Try starting with a thumbnailtransition

//      ActivityOptions opts =getThumbnailTransitionActivityOptions(topTask, stack,

//                    mDummyStackView);//取消fromthumbnail 动画

                 ActivityOptions opts =getHomeTransitionActivityOptions(false);

 

2.      取消进入时顶部底部黑色Scrm黑影动画recents\RecentsActivity.java

// mScrimViews.prepareEnterRecentsAnimation();       

// mScrimViews.startEnterRecentsAnimation();

// mScrimViews.startExitRecentsAnimation();

 

3.  裁剪任务列表

recents\views\TaskStackView.java

                   computeScroll(){  //  clipTaskViews();}

 

4.  任务列表退出动画

recents\views\TaskStackView.java

         // tv.startExitToHomeAnimation(ctx);

 

5.  显示最近列表右上角删除x 图标

recents\views\TaskStackView.java

                   //  mUIDozeTrigger.startDozing();

 

6.    取消桌面进入动画

         recents\views\TaskStackView.java

onFirstLayout()   /* …… */

 

startExitToHomeAnimation() 退出到桌面动画

startDismissAllAnimation()清理按钮清理动画

 

7.  取消最近任务列表点击外部退出

recents\views\TaskStackViewTouchHandler.java

                   //  maybeHideRecentsFromBackgroundTap((int)ev.getX(), (int) ev.getY());

 

0 0
原创粉丝点击