如何从应用程序的堆栈活动中获取任何活动

时间:2014-05-08 02:09:53

标签: android android-activity

我有一个活动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(活动[i]合格)               展示活动。

如何浏览正在运行的列表活动以及如何从堆栈到前端获取任何活动? 希望你理解我并支持我这个问题。 谢谢大家都读过。

3 个答案:

答案 0 :(得分:0)

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);
    }
}

}

答案 1 :(得分: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);
}

ActivityHashMap被销毁时删除

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

最后,当需要从列表中检索Activity时,您还可以检查Activity是否已经启动

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

答案 2 :(得分:0)

非常感谢你的答案,@ 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但是在屏幕上是透明的,没有它在屏幕上显示的视图。 我想......