Activity任務棧的管理 -----銷燬前一個相同的activity(還有一種簡單的方法實現)
阿新 • • 發佈:2019-02-13
需求:介面A跳轉到介面B,之後再跳轉到介面A,此時需要銷燬第一次建立的介面A,以此類推….
思路:(在每次建立當前Activity的時候銷燬前部的activity即可,然後在添加當前activity的引用)
編寫ActivityManagement的介面控制管理器
package com.lzyc.ybtappcal.app;
import android.support.v4.app.FragmentActivity;
import java.util.LinkedList;
/**
* 介面控制管理類
* package_name com.lzyc.ybtappcal.app
*/
public class ActivityManagement {
private static ActivityManagement instance;
private static LinkedList<FragmentActivity> activityList;
private static LinkedList<FragmentActivity> activityListRegister;
private static LinkedList<FragmentActivity> activityListCapture;
public ActivityManagement(){
if(activityList==null){
activityList=new LinkedList<FragmentActivity>();
}
if(activityListRegister==null){
activityListRegister=new LinkedList<FragmentActivity>();
}
if(activityListCapture==null){
activityListCapture=new LinkedList<FragmentActivity>();
}
}
public static ActivityManagement getInstance(){
if(instance==null){
instance=new ActivityManagement();
}
return instance;
}
public void addActivity(FragmentActivity acy) {
activityList.add(acy);
}
public void addActivityRegiser(FragmentActivity acy) {
activityListRegister.add(acy);
}
public void addActivityCapture(FragmentActivity acy) {
activityListCapture.add(acy);
}
/**
* 銷燬所有
*/
public static void removeAll(){
FragmentActivity acy;
while (activityList.size() != 0) {
//poll(),方法檢索並移除此列表的頭元素(第一個元素)
acy = activityList.poll();
//isFinishing(),判斷當前activity是否被幹掉;避免空指標
if (acy != null && !acy.isFinishing()) {
acy.finish();
}
}
}
/**
* 銷燬註冊相關介面
*/
public static void removeRegisterAll(){
FragmentActivity acy;
while (activityListRegister.size() != 0) {
acy = activityListRegister.poll();
if (acy != null && !acy.isFinishing()) {
acy.finish();
}
}
}
/**
* 銷燬註冊相關介面
*/
public static void removeCaptureAll(){
FragmentActivity acy;
while (activityListCapture.size() != 0) {
acy = activityListCapture.poll();
if (acy != null && !acy.isFinishing()) {
acy.finish();
}
}
}
}
這裡介面A和介面B,整合BaseActivity,所以我們在BaseActivity的onCreate中添加當前的引用到集合中去
第一步:BaseActivity中添加當前activity的引用
ActivityManagement.getInstance().addActivity(this);
第二步:在介面A中先清空,在新增
//移除做了判斷,避免第一次建立的時候沒有前一個空指標
ActivityManagement.removeCaptureAll();
ActivityManagement.getInstance().addActivityCapture(this);
第三步:在介面B新增,當前的應引用
ActivityManagement.getInstance().addActivityCapture(this);
最後就搞定了,想寫Demo試試的話在 onCreate 和onDestory列印Log看看建立的次數即可
實現方式二: 介面A跳轉介面B(此時銷燬A),介面B在跳轉介面A(此時銷燬B),如此迴圈… 注:這些Activity都是在一個任務棧裡面的
簡單的實現為:
//只需要在介面跳轉的時候,給Flag, findViewById(R.id.start_black).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent();
//設定這連個Flag就可以解決了
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.setClass(ActivityThird.this, ActivitySecond.class);
startActivity(intent);
}
});