簡體   English   中英

如何從應用程序的堆棧活動中獲取任何活動

[英]How to get any activity from stack activities of application

我有一個活動為A,B,C,D,E的應用程序。 活動A從啟動器開始,活動B從A開始,活動C從B開始,活動D從C開始,活動E從D開始。像A-> B-> C-> D->E。現在在活動E,我想做:

for(int i = 0; i <listActivity; i ++)if(activity [i]合格)顯示活動。

如何瀏覽正在運行的列表活動以及如何從堆棧中獲取任何活動到最前面? 希望您理解我並支持我解決這個問題。 謝謝大家讀過。

A,B,C,D,E 活動擴展了BaseActivity

public abstract class BaseActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    AppManager.getAppManager().addActivity(this);
    }
}

那么您可以使用AppManager.getAppManager().XXXX來做點什么。

public class AppManager {
private static Stack<Activity> activityStack;
private static AppManager instance;

private AppManager() {
}

public static AppManager getAppManager() {
    if (instance == null) {
        instance = new AppManager();
    }
    return instance;
}

/**
 * AddmActivity to stack
 */
public void addActivity(Activity activity) {
    if (activityStack == null) {
        activityStack = new Stack<Activity>();
    }
    activityStack.add(activity);
}

/**
 * Get current Activity(stack Top Activity)
 */
public Activity currentActivity() {
    if (activityStack == null || activityStack.isEmpty()) {
        return null;
    }
    Activity activity = activityStack.lastElement();
    return activity;
}

public Activity findActivity(Class<?> cls) {
    Activity activity = null;
    for (Activity aty : activityStack) {
        if (aty.getClass().equals(cls)) {
            activity = aty;
            break;
        }
    }
    return activity;
}

/**
 * Finish Activity(Stack Top Activity)
 */
public void finishActivity() {
    Activity activity = activityStack.lastElement();
    finishActivity(activity);
}

/**
 * Finish someone Activity
 */
public void finishActivity(Activity activity) {
    if (activity != null) {
        if (activityStack.contains(activity)) {
            activityStack.remove(activity);
            activity.finish();
            activity = null;
        }
    }
}

/**
 * Finish someone Activity
 */
public void finishActivity(Class<?> cls) {
    for (Activity activity : activityStack) {
        if (activity.getClass().equals(cls)) {
            finishActivity(activity);
        }
    }
}

/**
 * Finish All Activity except cls,if cls not in stack ,then clear all
 * @param cls
 */
public void finishOthersActivity(Class<?> cls) {
    for (Activity activity : activityStack) {
        if (!(activity.getClass().equals(cls))) {
            finishActivity(activity);
        }
    }
}

/**
 * Finish All Activity
 */
public void finishAllActivity() {
    for (int i = 0, size = activityStack.size(); i < size; i++) {
        if (null != activityStack.get(i)) {
            if (activityStack.contains(activityStack.get(i))) {
                activityStack.get(i).finish();
            }
        }
    }
    activityStack.clear();
}

/**
 * exit
 */
public void AppExit(Context context) {
    try {
        finishAllActivity();
        ActivityManager activityMgr = (ActivityManager) context
                .getSystemService(Context.ACTIVITY_SERVICE);
        activityMgr.killBackgroundProcesses(context.getPackageName());
        System.exit(0);
        android.os.Process.killProcess(android.os.Process.myPid());
    } catch (Exception e) {
        System.exit(0);
    }
}

}

創建一個Base Activity以保留應用程序中所有已started Activity 所有其他Activity需要擴展到Base Activity

啟動Activity ,將其添加到HashMapArrayList 我希望在我的Application類中聲明這一點

  public class MyApp extends Application {
    public static HashMap<String , CommonActivity > mBackStackActivities
        = new HashMap<String, CommonActivity>();
  }

現在,創建Base Activity並將Activity實例放入HashMap

 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_common);
    MyApp.mBackStackActivities.put(getComponentName().getClassName(), this);
}

銷毀HashMapActivity后,將其刪除

 @Override
protected void onDestroy(){
    MyApp.mBackStackActivities.remove(getComponentName().getClassName());
    super.onDestroy();
}

最后,在需要時從列表中檢索“ Activity ,您還可以檢查“ Activity是否已啟動

 if(MyApp.mBackStackActivities
        .containsKey(intent.getComponent().getClassName())){

非常感謝您的回答@Libin和@ Gavin2058,我創建了一個類似於您的類,將活動保存到List中,並且當我想在List中獲得活動時,我檢查:

public static boolean checkActivityExist(Class<?> activity) {
    int size = ActivityHistory.size();
    for (int i = size - 1; i >= 0; i--) {
        Activity ac = ActivityHistory.get(i);
        if (activity.isAssignableFrom(ac.getClass())) {
            return true;
        }
    }
    return false;
}

如果條件正確,我將開始活動並開始活動:

public static void startActiByStateTab(AbstractActivity c, STATESTAB state) {
    int size = ActivityHistory.size();
    for (int i = size - 1; i >= 0; i--) {
        AbstractActivity ac = (AbstractActivity)ActivityHistory.get(i);
        if (ac.getIsTab() == state) {

            Intent intent = new Intent(c, ac.getClass());
            intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
            c.startActivity(intent);
            break;
        }

    }
}

但是我調試並看到了我剛剛開始的活動,它進入onResume,但是在屏幕上是透明的,沒有任何視圖顯示在屏幕上。 我在想....

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM