I have an application with activities A,B,C,D,E. Activity A starts from launcher, B from A, C from B, D from C and E from D. like A -> B -> C -> D -> E. Now at activity E, i want to do:

for(int i=0; i < listActivity; i++) if(activity[i] eligible) show activity.

How to browse through the list activity running and how get any activity from stack to front? Hope you understand me and support me for this issue. Thanks everyone has read.

有帮助吗?

解决方案

A,B,C,D,E. Activity extends BaseActivity

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

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

then you can use AppManager.getAppManager().XXXX do you something.UnderStand?

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

}

其他提示

Create a Base Activity to keeps hold of all the started Activity in your application. All other Activity need to extend to Base Activity

When an Activity is launched, add it to HashMap or ArrayList. I would prefer to declare this in my Application class

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

Now, create the Base Activity and put the Activity instance into HashMap

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

Remove the Activity from HashMap when its destroyed

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

Finally, when required retrieve the Activity from list, You can also check if the Activity is already launched

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

Thanks so much about your answers,@Libin and @Gavin2058 , I create a class similar measures of you, i save activity to a List, and when i want get a activity in List , i check :

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

if conditions true, i get activity and start it:

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

    }
}

But I debug and see the activity I just start, it come to onResume but in screen is transparent, no view of it display in screen. I thinking....

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top