Activity的啟動(dòng)模式
在android開發(fā)過程中,有些需求的實(shí)現(xiàn)用activity的啟動(dòng)模式的知識(shí)來完成會(huì)很簡單。
比如:
- 簡單的例子:
防止多次點(diǎn)擊,出現(xiàn)多個(gè)重復(fù)的activity頁面,這時(shí)候就可以簡單的采用singleTop配置來防止處于棧頂?shù)捻撁姹恢貜?fù)打開。
- 稍微麻煩點(diǎn)兒:
我在完成幾個(gè)頁面的信息選擇之后漠嵌,需要將這幾個(gè)頁面的數(shù)據(jù)回顯到最初的頁面,并且關(guān)閉中間這幾個(gè)選擇頁面:A(目標(biāo)頁)->B(選擇頁面1)->C(選擇頁面2)->...(n個(gè)頁面)后返回A頁面并根據(jù)這些選擇的信息來做處理(回顯等)判哥,這時(shí)候activity的啟動(dòng)模式就起到作用了献雅。
// 方法一 :Manifest文件中不設(shè)置,代碼中設(shè)置Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP(缺一不可)
(Intent.FLAG_ACTIVITY_SINGLE_TOP可以在Manifest中用singleTop設(shè)置替代)
Intent intent = new Intent(this,A.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP);
intent.putExtra("title",title);//帶給A的信息
intent.putExtra("school",school);//帶給A的信息
startActivity(intent);
//方法二:在Manifest文件中設(shè)置singleTask的啟動(dòng)模式
Intent intent = new Intent(this,A.class);
intent.putExtra("title",title);//帶給A的信息
intent.putExtra("school",school);//帶給A的信息
startActivity(intent);
以這種方式重新啟動(dòng)目標(biāo)activity,會(huì)調(diào)用activity的onNewIntent方法塌计,方法一如果丟失了singleTop的配置挺身,雖然可以重新打開目標(biāo)activity,但是不會(huì)調(diào)用onNewIntent的方法锌仅。
其他類似的處理方式
首先這個(gè)類最初是在郭嬸做權(quán)限處理的視頻中看到的
public class ActivityCollector {
private static List<Activity> activityList = new ArrayList<>();
/**
* 將當(dāng)前啟動(dòng)的activity加入list
*/
public static void addActivity(Activity activity){
activityList.add(activity);
}
/**
* 將銷毀的activity移出list
*/
public static void removeActivity(Activity activity){
activityList.remove(activity);
}
/**
* 獲取棧頂activity
*/
public static Activity getTopActivity(){
if(!activityList.isEmpty()){
return activityList.get(activityList.size()-1);
}else{
return null;
}
}
/**
* 關(guān)閉size個(gè)activity
*/
public static void finish(int size){
for(int i=0;i<size;i++){
if(getTopActivity()!=null){
getTopActivity().finish();
removeActivity(getTopActivity());
}
}
}
}
在項(xiàng)目的activity基類中使用ActivityCollector 來構(gòu)造啟動(dòng)activity的集合
public class ABaseActivity extends AppCompatActivity{
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityCollector.addActivity(this);
}
/**
* onDestroy
* 要去回收資源
* 做好處理
*/
@Override
protected void onDestroy() {
super.onDestroy();
ActivityCollector.removeActivity(this);
}
}
這樣一來你就可以隨意的關(guān)閉任意個(gè)activity章钾,如果有必要,你仍然可以在ActivityCollector中添加自己需要的方法热芹。
【END】之所以沒有在這篇中介紹activity啟動(dòng)模式的知識(shí)點(diǎn)贱傀,是因?yàn)槲恼绿嗔耍v解細(xì)致的比比皆是伊脓,下面幾個(gè)博文各有特色府寒,可以參考(注意文章和評(píng)論結(jié)合看):
- 我打賭你一定沒搞明白的Activity啟動(dòng)模式
- 徹底弄懂Activity四大啟動(dòng)模式
- 最易懂的Activity啟動(dòng)模式詳解
- Android中Activity四種啟動(dòng)模式和taskAffinity屬性詳解
Android開發(fā)藝術(shù)探索這本書中也有對(duì)啟動(dòng)模式的詳盡介紹,第一篇應(yīng)該也是以書中為主體的一篇博文报腔。
每篇博文代表了各位作者的闡述思路株搔,側(cè)重也各有不同,以及試圖闡述知識(shí)過程中采用的方法纯蛾。