Activity的四種launchMode
launchMode在多個(gè)Activity跳轉(zhuǎn)的過程中扮演著重要的角色祷愉,它可以決定是否生成新的Activity實(shí)例溺拱,是否重用已存在的Activity實(shí)例,是否和其他Activity實(shí)例公用一個(gè)task里谣辞。這里簡單介紹一下task的概念迫摔,task是一個(gè)具有棧結(jié)構(gòu)的對(duì)象,一個(gè)task可以管理多個(gè)Activity泥从,啟動(dòng)一個(gè)應(yīng)用句占,也就創(chuàng)建一個(gè)與之對(duì)應(yīng)的task。
Activity一共有以下四種launchMode:
1.standard
2.singleTop
3.singleTask
4.singleInstance
在AndroidManifest.xml配置<activity>的Android:launchMode屬性為以上四種之一即可
一.standard
默認(rèn)啟動(dòng)模式躯嫉。每當(dāng)啟動(dòng)一個(gè)新的活動(dòng)纱烘,他就會(huì)在返回棧中入棧,并處于棧頂?shù)奈恢闷聿汀?duì)于使用該模式的活動(dòng)擂啥,系統(tǒng)不會(huì)在乎這個(gè)活動(dòng)是否已經(jīng)在返回棧中存在,每次啟動(dòng)都會(huì)創(chuàng)建該活動(dòng)的一個(gè)新的實(shí)例帆阳。
二.singleTop
在啟動(dòng)活動(dòng)時(shí)如果發(fā)現(xiàn)返回棧的棧頂已經(jīng)是該活動(dòng)哺壶,則認(rèn)為可以直接使用它,不會(huì)再創(chuàng)建新的活動(dòng)實(shí)例蜒谤。如果已經(jīng)存在山宾,但不是棧頂,則創(chuàng)建
三.singleTask
每次啟動(dòng)活動(dòng)時(shí)會(huì)系統(tǒng)首先檢查返回棧中是否已經(jīng)存在該活動(dòng)的實(shí)例鳍徽,如果發(fā)現(xiàn)已經(jīng)存在則直接使用該實(shí)例资锰,并把該實(shí)例之上的所有活動(dòng)統(tǒng)統(tǒng)出棧;如果沒有發(fā)現(xiàn)就會(huì)創(chuàng)建一個(gè)新的實(shí)例阶祭。
四.singleInstance
指定為singleInstance模式的活動(dòng)會(huì)啟用一個(gè)新的返回棧來管理這個(gè)活動(dòng)绷杜。(使用場景例如:實(shí)現(xiàn)其他程序可以共享某個(gè)活動(dòng)的實(shí)例,有一個(gè)單獨(dú)的返回棧來管理活動(dòng)濒募,多個(gè)應(yīng)用程序都可以訪問這個(gè)活動(dòng)鞭盟,其他三個(gè)啟動(dòng)模式都無法實(shí)現(xiàn))
活動(dòng)拓展:
常規(guī)的數(shù)據(jù)傳遞
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
intent.putExtra("param1","111111111111111");
intent.putExtra("param2","222222222222222");
startActivity(intent);
在真正的項(xiàng)目開發(fā)中經(jīng)常會(huì)有對(duì)接的問題出現(xiàn)。比如SecondActivity并不是由自己開發(fā)的萨咳,但要啟動(dòng)它懊缺,而且不清楚傳遞的數(shù)據(jù)。以下方法可以輕松解決問題
SecondActivity.class
public class SecondActivity extends AppCompatActivity {
.......
public static void actionStart(Context context, String data1, String data2) {
Intent intent = new Intent(context, SecondActivity.class);
intent.putExtra("param1", data1);
intent.putExtra("param2", data2);
context.startActivity(intent);
}
......
}
MainActivity.class
bt1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SecondActivity.actionStart(MainActivity.this,"111111111111111","2222222222222222222");
}
});