編輯:Android開發教程
1.1.1 handleTransaction
有兩個相似的函數,handleTransaction需要獲取mStateLock鎖,執行handleTransactionLocked,最後再將mHwWorkListDirty置為true。
後一個handleTransactionLocked才是真正處理業務的地方。從前面我們對transactionflags的解釋來推斷,它的具體工作應該會分為兩部分,即traversal(對應eTraversalNeeded)和transaction(對應eTransactionNeeded)。
void SurfaceFlinger::handleTransactionLocked(uint32_ttransactionFlags)
{
const LayerVector¤tLayers(mCurrentState.layersSortedByZ);
const size_t count =currentLayers.size();
/*第一部分,traversal所有layer*/
const boollayersNeedTransaction = transactionFlags & eTraversalNeeded;
if (layersNeedTransaction){//是否需要traversal
for (size_t i=0 ; i<count ; i++) {//逐個layer來處理
constsp<LayerBase>& layer = currentLayers[i];
uint32_t trFlags = layer->getTransactionFlags(eTransactionNeeded);/*這個layer是否
需要doTransaction*/
if (!trFlags)continue;//如果不需要的話,直接進入下一個
const uint32_tflags = layer->doTransaction(0);//由各layer做內部處理,下面會做詳細分析
if (flags &Layer::eVisibleRegion)//各layer計算可見區域是否變化
mVisibleRegionsDirty = true;//可見區域發生變化
}
}
/*第二部分,SurfaceFlinger執行transaction*/
if (transactionFlags &eTransactionNeeded) {
if (mCurrentState.orientation != mDrawingState.orientation) {
/*角度產生變化,需要重新計算所有的可見區域,並且重繪*/
const int dpy = 0;//第一個Display
const intorientation = mCurrentState.orientation; //新的orientation
GraphicPlane&plane(graphicPlane(dpy));
plane.setOrientation(orientation);//將改變後的旋轉角度設置到底層管理者
// update theshared control block
constDisplayHardware& hw(plane.displayHardware());
/*下面的dcblk是一個供應用程序查詢當前顯示屬性的“服務機構”,因而需要同步更新它*/
volatiledisplay_cblk_t* dcblk = mServerCblk->displays + dpy;
dcblk->orientation = orientation;
dcblk->w =plane.getWidth();
dcblk->h =plane.getHeight();
mVisibleRegionsDirty= true; //旋轉角度變化,當然可見區域也會變化
mDirtyRegion.set(hw.bounds());//整個屏幕區域都是“髒”的
}
if (currentLayers.size() > mDrawingState.layersSortedByZ.size()) {// 有新的layer增加
mVisibleRegionsDirty = true;//可見區域需要重新計算
}
if (mLayersRemoved) {/*也可能有layers已經被移除,這樣可見區域也會有變化。
比如原本被遮蓋的部分或許就暴露出來了*/
mLayersRemoved =false; //
mVisibleRegionsDirty = true;
constLayerVector& previousLayers(mDrawingState.layersSortedByZ);
const size_t count= previousLayers.size();
for (size_t i=0 ;i<count ; i++) {
constsp<LayerBase>& layer(previousLayers[i]);
if(currentLayers.indexOf( layer ) < 0) {/*在之前狀態中存在,在現有狀態中找不到,
說明它被removed了*/
mDirtyRegionRemovedLayer.orSelf(layer->visibleRegionScreen);/*被移除layer的可見
區域*/
}
}
}
}
commitTransaction();//和Layer::doTransaction()的做法基本一樣,多了幾步操作
}
本例實現的功能和例子Android RoboGuice 使用指南(2):第一個例子Hello World一樣,所不同的是本例使用RoboGuice2.0 來實現。下載新的
Android應用中的Activity指具有屏幕顯示支持用戶交互的基本模塊,類似於Java ME中的MIDlet, Windows 應用中的Form。 比如可以是撥號,發
Android API Demos中有很多非常Nice的例子,這些例子的代碼都寫的很出色,如果大家把API Demos中的 每個例子研究透了,那麼恭喜你已經成為一個真正的
CyanogenMod 10(CM10),最新基於Android 4.1果凍豆版本的ROM,在今天對少數設備推出。版本10已經在過去的數月經歷了無數個夜晚的beta開發,