android 4.0 StatusBar Service

重要的屬性值:StatusBarView mStatusBarView;這個就是我們看到的StatusBar的View。

NotificationCallbacks mNotificationCallbacks; 用於NotificationManagerService的回調函數。將消息通知 NotificationManagerService

HashMap<IBinder,StatusBarIcon> mIconMap = new HashMap<IBinder,StatusBarIcon>(); 保存更新或者增加圖標的Client端引用

ArrayList<StatusBarIcon> mIconList = new ArrayList<StatusBarIcon>(); 現在在顯示中的所有圖標的引用

LinearLayout mIcons;                      普通的圖標要加到這個佈局中,此佈局屬於mStatusBarView

IconMerger mNotificationIcons           Notification圖標加到這個佈局中,此佈局也屬於mStatusBarView

ExpandedView mExpandedView;         我們在點擊StatusBar時,會出現新的View可供我們拖拽擴大,

                                                           我猜這個變量就代表瞭那個View

boolean mExpanded;                          這個變量表明拖動時動態變更的View是否已經展開。

DateView mDateView;                我們點擊StatusBar之後,會在StatusBar上出現年月日期,這個代表那個View。

我一直好奇點擊StatusBar會出現新的View,它的流程如下:
mStatusBarView就是StatusBar所代表的View,那麼查看它的代碼,看它處理點擊的方法。

它屬性變量保存瞭StatusBarService的引用,它的點擊處理函數onTouchEvent()和onInterceptTouchEvent()都會調用到StatusBarService 類中的interceptTouchEvent()方法。

當我們點擊StatusBar時,會先走到onInterceptTouchEvent()這個函數,而且這個函數隻會在第一次走到,然後會走到onTouchEvent()方法,這個方法每收到一個TouchEvent()就會走到,因此會走到多次。

函數onInterceptTouchEvent()的處理:

1、調用到StatusBarService中的interceptTouchEvent(),在這裡又會走到event.getAction() == MotionEvent.ACTION_DOWN 分支,在分支中,由於mExpanded == false且y < hitSize 會繼續調用prepareTracking(y)。

2、函數prepareTracking()處理:這裡由於mExpanded == false 所以會向H中發送MSG_ANIMATE_REVEAL消息,進入StatusBarService自己的消息循環。執行doRevealAnimation()函數。

3、函數doRevealAnimation()處理:這個實現的功能很簡單,就是在TrackingView(就是點擊時StatusBar下出現的View)還沒有完全顯示出來的時候,通過動畫的方式,一點一點的將TrackingView顯示出來。www.aiwalls.com

當我們手指離開時調用順序如下:

1、StatusBarView:onTouchEvent(),此時Action != MotionEvent.ACTION_DOWN走到 StatusBarService:interceptTouchEvent();

2、interceptTouchEvent()中會走到分支 else if (mTracking);

3、由於ACTION_UP 所以會調用performFling(),在這裡會向Handler發送 MSG_ANIMATE 消息,然後進入函數doAnimation()。

4、在doAnimation()由於mAnimY < mStatusBarView.getHeight()分支成立,會繼續調用updateExpandedViewPos(0)和performCollapse();

5、在performCollapse()中,通過mTrackingView.setVisibility(View.GONE) 實現瞭 讓mTrackingView的隱藏,其實這個函數還實現瞭其他的View的隱藏,比如我們點擊後進行拖動所出現的其他View。

 

 

作者:LuoXianXion

發佈留言