^Activity的生命周期
protected void onCreate(Bundle savedInstanceState);?
protected void onRestart();?
protected void onStart();?
protected void onResume();?
protected void onPause();?
protected void onStop();?
protected void onDestory();?
以上為Activity生命周期中的各個時期的回調(diào)方法,在不同的方法中我們可以執(zhí)行不同的邏輯呐萌。
^Activity的啟動模式
activity啟動時可以設(shè)置不同的啟動模式(launchMode),主要是:
standrand:這個模式是默認的啟動模式谊娇,即標準模式肺孤,在不指定啟動模式的前提下,系統(tǒng)默認使用該模式啟動Activity济欢,每次啟動一個Activity都會重寫創(chuàng)建一個新的實例赠堵,不管這個實例存不存在,這種模式下法褥,誰啟動了該模式的Activity茫叭,該Activity就屬于啟動它的Activity的任務(wù)棧中。這個Activity它的onCreate()半等,onStart()揍愁,onResume()方法都會被調(diào)用呐萨。
singleTop:這個模式下,如果新的activity已經(jīng)位于棧頂莽囤,那么這個Activity不會被重寫創(chuàng)建谬擦,同時它的onNewIntent方法會被調(diào)用,通過此方法的參數(shù)我們可以去除當前請求的信息朽缎。如果棧頂不存在該Activity的實例惨远,則情況與standard模式相同。需要注意的是這個Activity它的onCreate()话肖,onStart()方法不會被調(diào)用北秽,因為它并沒有發(fā)生改變。(
singleTop模式分3種情況:
當前棧中已有該Activity的實例并且該實例位于棧頂時狼牺,不會新建實例羡儿,而是復(fù)用棧頂?shù)膶嵗⑶視ntent對象傳入是钥,回調(diào)onNewIntent方法
當前棧中已有該Activity的實例但是該實例不在棧頂時掠归,其行為和standard啟動模式一樣,依然會創(chuàng)建一個新的實例
當前棧中不存在該Activity的實例時悄泥,其行為同standard啟動模式)
singleTask:這個模式十分復(fù)雜虏冻,有各式各樣的組合。在這個模式下弹囚,如果棧中存在這個Activity的實例就會復(fù)用這個Activity厨相,不管它是否位于棧頂,復(fù)用時鸥鹉,會將它上面的Activity全部出棧蛮穿,并且會回調(diào)該實例的onNewIntent方法。其實這個過程還存在一個任務(wù)棧的匹配毁渗,因為這個模式啟動時践磅,會在自己需要的任務(wù)棧中尋找實例,這個任務(wù)棧就是通過taskAffinity屬性指定灸异。如果這個任務(wù)棧不存在府适,則會創(chuàng)建這個任務(wù)棧
singleInstance?:該模式具備singleTask模式的所有特性外,與它的區(qū)別就是肺樟,這種模式下的Activity會單獨占用一個Task棧檐春,具有全局唯一性,即整個系統(tǒng)中就這么一個實例么伯,由于棧內(nèi)復(fù)用的特性疟暖,后續(xù)的請求均不會創(chuàng)建新的Activity實例,除非這個特殊的任務(wù)棧被銷毀了。以singleInstance模式啟動的Activity在整個系統(tǒng)中是單例的俐巴,如果在啟動這樣的Activiyt時朋贬,已經(jīng)存在了一個實例,那么會把它所在的任務(wù)調(diào)度到前臺窜骄,重用這個實例。
等四種啟動模式摆屯,不同的啟動模式在啟動Activity時會執(zhí)行不同的邏輯邻遏,系統(tǒng)會按不同的啟動模式將Activity存放到不同的activity棧中。
^Activity的啟動進程
在Manifest.xml中定義Activity的時候虐骑,Activity默認是屬于進程名稱為包名的進程的准验,當然這時候是可以指定Activity的啟動進程,所以在Activity啟動時首先會檢測當前Activity所屬的進程是否已經(jīng)啟動廷没,若進程沒有啟動糊饱,則首先會啟動該進程,并在該進程啟動之后才會執(zhí)行Activity的啟動過程.
Intent啟動Activity的方式
Intent啟動Activity分為兩種颠黎,顯示啟動和隱士啟動另锋,顯示啟動就是在初始化Intent對象的時候直接引用需要啟動的Activity的字節(jié)碼,顯示引用的好處就是可以直接告訴Intent對象啟動的Activity對象不需要執(zhí)行intent filter索引需要啟動哪一個Activity狭归,但是顯示引用不能啟動其他進程的Activity對象夭坪,因為無法獲取其他進程的Activity對象的字節(jié)碼,而隱式啟動則可以通過配置Intent Filter啟動其他進程的Activity對象过椎,因此在應(yīng)用內(nèi)室梅,我們一般都是使用顯示啟動的方式啟動Activity,而如果需要啟動其他應(yīng)用的Activity時疚宇,一般使用隱式啟動的方式亡鼠。
Intent啟動多個Activity的方式
1.利用startActivities(Intent[] intents);
Intent i1= new Intent(this, Activity1.class);
Intent i2= new Intent(this, Activity2.class);
Intent[] intents = new Intent[2];
intents[0] = i1;
intents[1] = i2;
startActivities(intents);
2.?PendingIntent
Intent i1= new Intent(this, Activity1.class);
Intent i2= new Intent(this, Activity2.class);
Intent[] intents = new Intent[2];
intents[0] = i1;
intents[1] = i2;
PendingIntent mPendingIntent = PendingIntent.getActivities(this, 0, intents, 0);try {
? ? mPendingIntent.send();
} catch (PendingIntent.CanceledException e) {
? ? e.printStackTrace();
}