2018-01-13

private final String parseDefaultActivityName(){
return this.packageInfo.activities != null && this.packageInfo.activities.length>0 ? this.packageInfo.activities[0].name:"";
}

//Theme setTo //將other Theme 的相同的復(fù)制到this
// TypeArray Theme里面的各個(gè)屬性值
//自定義Theme Theme必須繼承于某個(gè)已經(jīng)存在的Theme
/************/
應(yīng)用Theme屬性的兩種方式
1.在AndroidManifest.xml文件在<application /> 或者<activity/> 節(jié)點(diǎn)設(shè)置android:theme屬性
2.直接在代碼中調(diào)用setTheme()設(shè)置該Activity的主題,必須在第一次調(diào)用setContentView()前調(diào)用

自定義主題::///
<style name="MyTheme" parent="@android:style/Theme" >
<item name="android:windowNoTitle">true</item>
<item name="android:windowFrame">@drawable/icon</item>
<item name="android:windowBackground">****</item>
</style> // 很像DuiLib

兩個(gè)簡(jiǎn)單的api制定界面風(fēng)格

requestFeature(); getWindow().setFlags();

動(dòng)態(tài)加載里面應(yīng)用主題的代碼其實(shí)也是模仿系統(tǒng)加載流程
//參加 系統(tǒng)generateLayout(DecorView decor)-->getWindowStyle()-->obtainStyledAttributes()-->getTheme()

@Override
public Resources.Theme getTheme(){
if(mTheme != null){
return mTheme;
}
if(mThemeResource == 0){
mThemeResource = com.android.internal.R.style.Theme;
}
initializeTheme();
return mTheme;
}

private void initializeTheme(){
final boolean first = mTheme ==null;
if(first){
mTheme = getResources().newTheme();
Resources.Theme theme = mBase.getTheme();
// 調(diào)用ContextImpl類的getTheme()并级,獲取默認(rèn)的Theme
if(theme!=null){
mTheme.setTo(theme);//將theme配置應(yīng)用到mTheme屬性中择吊??缓苛?TypeArray
}
}
onApplyThemeResource(mTheme,mThemeResource,first);
}

如果沒有手動(dòng)設(shè)置 mThemeResource,則選取系統(tǒng)中為我們提供的默認(rèn)Theme,
方法一:Activity中調(diào)用setTheme()方法邓深,該方法實(shí)現(xiàn)在ContextThemWrapper.java
public void setTheme(int resid){
mThemeResource = resid; //設(shè)置mThemeResource
initializeTheme();
}

方法二:在AndroidManifest文件中未桥,為Activity節(jié)點(diǎn)配置android:theme屬性.
當(dāng)通過startActivity()啟動(dòng)一個(gè)Activity時(shí),會(huì)調(diào)用setTheme()方法芥备。
文件路徑:frameworks\base\core\java\android\app\ActivityThread.java

//宿主有了.jar ,而插件編譯時(shí)候也需要.jar冬耿,打包時(shí)候去掉***.jar
//不然就加載了兩次了,報(bào)錯(cuò) //工程運(yùn)行不了 //考慮bulid.gradle是否一致

//插件開發(fā)的三種模式
// 1.depend_on_host 插件完全依賴宿主的模式萌壳,適合于能夠得到宿主源代碼的情況
// 2.depend_on_interface 插件依賴宿主提供的接口亦镶,適合能夠拿到宿主接口的情況
// 3.main 插件不依賴宿主模式

//dl-lib author http://blog.csdn.net/zcxwww/article/details/51297587
//插件完全依賴宿主的模式,適合于能夠能到宿主的源代碼的情況袱瓮。
//這種模式一般多用在公司內(nèi)部缤骨,插件可以訪問宿主的所有代碼,
//但是尺借,這樣插件和宿主的耦合比較高绊起,宿主一動(dòng),插件就必須動(dòng)燎斩,比較麻煩

插件apk的開發(fā)規(guī)范
//1.不能用this虱歪,因?yàn)閠his指的是當(dāng)前對(duì)象,在不安裝的情況下瘫里,this只是一個(gè)普通的activity對(duì)象
//2.使用that: that在apk安裝運(yùn)行時(shí)候指向this实蔽,不安裝運(yùn)行時(shí)候指向proxyActivity
//3.不能直接調(diào)用activity的成員方法,必須通過that去調(diào)用谨读,由于that的動(dòng)態(tài)分配特性局装,
//通過that去調(diào)用activity的成員方法在安裝后依然可以正常運(yùn)行
// 4.啟動(dòng)新activity的約束,啟動(dòng)外部activity不受限制,啟動(dòng)apk內(nèi)部的activity有限制铐尚,由于
//apk中的activity沒注冊(cè)拨脉,所以不支持隱式調(diào)用,必須通過startActivityByProxy或者
//startActivityForResultByProxy,不支持launchMode
// 5.目前暫不支持Service宣增,BroadcastReceiver等需要注冊(cè)才能使用的組件

//dl最開始采取反射去管理activity的生命周期玫膀,bug:反射代碼寫起來復(fù)雜,過多使用反射有一定的性能開銷
//采取了接口機(jī)制爹脾,將activity的大部分生命周期方法提取出來作為一個(gè)接口(DLPlugin)帖旨,之后通過代理activity
//(DLProxyActivity)去調(diào)用插件activity實(shí)現(xiàn)的生命周期方法,這樣就完成了插件activity的生命周期管理
//而且沒有采取反射灵妨,當(dāng)我們想增加一個(gè)新的生命周期方法時(shí)候解阅,只需要在接口中聲明一下同時(shí)在代理activity中
//實(shí)現(xiàn)即可

//DLProxyActivity 在宿主apk中是注冊(cè)了的,所以可以直接通過Intent啟動(dòng)泌霍,DLProxyActivity實(shí)際是一個(gè)
//軀殼货抄,在自己的生命周期里面調(diào)用插件activity對(duì)應(yīng)的生命周期函數(shù),

//DLProxyImpl 負(fù)責(zé)解析插件apk的資源朱转,classLoader蟹地,反射加載插件activity,將實(shí)例傳遞給ProxyActivity
//所以ProxyActivity可以在自己的生命周期函數(shù)中調(diào)用activity對(duì)應(yīng)的函數(shù)
優(yōu)柔寡斷只會(huì)帶來痛苦藤为,10秒鐘想好 /// 你之前已經(jīng)寫過一次了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末怪与,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子凉蜂,更是在濱河造成了極大的恐慌琼梆,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件窿吩,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡错览,警方通過查閱死者的電腦和手機(jī)纫雁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來倾哺,“玉大人轧邪,你說我怎么就攤上這事⌒吆#” “怎么了忌愚?”我有些...
    開封第一講書人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)却邓。 經(jīng)常有香客問我硕糊,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任简十,我火速辦了婚禮檬某,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘螟蝙。我一直安慰自己恢恼,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開白布胰默。 她就那樣靜靜地躺著场斑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪牵署。 梳的紋絲不亂的頭發(fā)上漏隐,一...
    開封第一講書人閱讀 49,741評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音碟刺,去河邊找鬼锁保。 笑死,一個(gè)胖子當(dāng)著我的面吹牛半沽,可吹牛的內(nèi)容都是我干的爽柒。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼者填,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼浩村!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起占哟,我...
    開封第一講書人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤心墅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后榨乎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體怎燥,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年蜜暑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了铐姚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡肛捍,死狀恐怖隐绵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情拙毫,我是刑警寧澤依许,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站缀蹄,受9級(jí)特大地震影響峭跳,放射性物質(zhì)發(fā)生泄漏膘婶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一坦康、第九天 我趴在偏房一處隱蔽的房頂上張望竣付。 院中可真熱鬧,春花似錦滞欠、人聲如沸古胆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽逸绎。三九已至,卻和暖如春夭谤,著一層夾襖步出監(jiān)牢的瞬間棺牧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來泰國打工朗儒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留颊乘,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓醉锄,卻偏偏與公主長(zhǎng)得像乏悄,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子恳不,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348