最近要改藍牙相關(guān)的東西撒桨,順道看了看其中的Acitivity棋电,發(fā)現(xiàn)有些Activity找不到對應(yīng)的文件撕攒,不像在應(yīng)用層做的會有自己的XXX.java文件。例如我要修改的ConnectedDeviceDashboardActivity坦喘。
先在Settings App的Manifest中搜索它
發(fā)現(xiàn)只有這個activity,然后可以看到它是繼承于Settings這個activity,然后我又去文件目錄中找對應(yīng)的activity旗吁,發(fā)現(xiàn)找不到對應(yīng)的文件码倦,沒有辦法只有先去看它的父Activity蝗柔。
發(fā)現(xiàn)它也沒啥特別的嬉橙,只好去看看它對應(yīng)的文件,好在它又對應(yīng)的java文件伟件,于是就發(fā)現(xiàn)它的Activity都是這樣創(chuàng)建的。
哇议经,發(fā)現(xiàn)一個我從來沒見過的用法斧账,Settings下的大部分Activity都繼承于同一個父類,于是只好去看看它的父類煞肾,發(fā)現(xiàn)終于看到熟悉的Activity了咧织,先看了看onCreate()生命周期,
先從manifest文件中得到額外數(shù)據(jù)籍救,取得可能存在的要加載的Fragment习绢,但是Settings這個Activity沒有對應(yīng)的meta-Data,所以會返回空,繼續(xù)往下闪萄,
這里做了下是不是從快捷鍵進入梧却,是不是Settings主界面,mIsShowingDashboard這個參數(shù)決定了后面是加載Settings主界面還是其他的Activity败去,這里當前的Activity就是Settings放航,所以該值為true,繼續(xù)往下
這里設(shè)置了一下顯示導(dǎo)航欄圆裕,隱藏原來的標題欄并使其不可點擊广鳍,差不多Settings的Activity就啟動完了。
那么怎么加載的不同界面喃吓妆,還記得之前的getMetaData()方法里的mFragmentClass嗎赊时,搜索發(fā)現(xiàn)只有一處地方使用了getStartingFragmentClass()方法,找它的調(diào)用之處行拢,發(fā)現(xiàn)和之前對上了;如果返回的fragment不為空蛋叼,則把Fragment添加到intent中
發(fā)現(xiàn)存入Intent中的Fragment的名字馬上就取了出來,并且在后面被使用了剂陡,
如果savedState不為空狈涮,比如旋轉(zhuǎn)屏幕這種情況,那么就不從新加載鸭栖,
進入launchSettingFragment()方法歌馍,可以看到當不是顯示主設(shè)置界面以及加載的Fragement的名字不為空時,就會調(diào)用switchToFragment()方法
進入switchToFragment()方法晕鹊,經(jīng)過一些判斷Fragment沒有問題后松却,就可以初始化了,調(diào)用Fragment的instantiate方法溅话,
這個方法會先去緩存中查找有無該fragment晓锻,有則直接加載,沒有則會調(diào)用newInstance()方法創(chuàng)建一個新的Fragment飞几,之后在這個方法里還會判斷args是否為null砚哆,不為null則將之前的參數(shù)保存到新的fragment中,這也告訴我們在Fragment中存儲數(shù)據(jù)最好使用setArguments()方法傳遞數(shù)據(jù)屑墨,而不是通過帶參數(shù)的構(gòu)造方法躁锁,
擴展:
看看onResume()生命周期,
發(fā)現(xiàn)只有這么幾行代碼卵史,進入updateTitlesList()方法战转,
發(fā)現(xiàn)它開啟了一個線程調(diào)用doUpdateTilesList()方法,進入以躯,
進入該方法發(fā)現(xiàn)一長串的setTileEnabled方法槐秧,又調(diào)用了new ComponentName(),直覺告訴我們終于要找了,進入setTileEnabled()刁标,
先判斷是否合法颠通,然后返回,在該文件中搜索setTileEnabled()方法命雀,你會發(fā)現(xiàn)只有這么一處,不科學(xué)啊斩箫,參數(shù)對不齊吏砂,肯定不是這個方法了,又不可能是實現(xiàn)接口乘客,那就只能是繼承了狐血,
然后你就發(fā)現(xiàn)它還不在同一個包下,只有跳出工程去看看易核,找到SettingsDrawerActivity匈织,
搜索setTileEnabled()方法,
這里傳入的enabled的值是由!UserManager.isDeviceInDemoMode(this)牡直,一般為enabled值為ture缀匕,我查看了isDeviceInDemoMode()這個方法,發(fā)現(xiàn)它和Demo Mode碰逸,演示模式有關(guān)乡小,一般沒開啟演示模式就不會返回true,
今日份就分析到這兒饵史,又學(xué)到了好多满钟。
手打不易,給個贊唄(Ubuntu下沒表情~_~)