ActivityQueueManager 自己管理的activity队列

来源:互联网 发布:淘宝店如何卖网游装备 编辑:程序博客网 时间:2024/05/21 09:37

ActivityQueueManager

当我们写一个android项目时,很多时候我们都想自己管理我们的activity队列,比如当我们开启新的activity时就加人到队列,当我们finish时就从队列中删除。这样还有一个很明显的好处就是,当我们退出应用时直接遍历这个队列把其中加人的activity挨个finish掉即可。

这里我们需要提供出来的方法:

  • 添加一个activity(pushActivity)
  • 删除一个activity(popActivity)
  • 获取队列中最上层activity(pop)
  • 获取队列中的某一个activity(popIndex)
  • 删除掉队列中所有的activity,退出应用使用(finishAllActivity)
  • 关闭掉队列中的最上层的N个activity,很多应用需要的一个方法(closeNumberActivities)


public class ActivityQueueManager {


private static final ActivityQueueManager mInstance = new ActivityQueueManager();

private final static String TAG = ActivityQueueManager.class.getSimpleName();
private static LinkedList<Activity> mQueue;

private ActivityQueueManager() {
ActivityQueueManager.mQueue = new LinkedList<Activity>();
}

/**
* push activity to queue
*
* @param activity
* @return void
* @throws
*/
public void pushActivity(Activity activity) {
mInstance.doPushActivity(activity);
Log.v(TAG, "pushActivity size=" + mQueue.size() + " name=" + activity.getLocalClassName());
}

/**
* pop activity from queue
*
* @param activity
* @return void
* @throws
*/
public void popActivity(Activity activity) {
mInstance.doPopActivity(activity);
Log.v(TAG, "popActivity size=" + mQueue.size() + " name=" + activity.getLocalClassName());
}

/**
* pop the stack top activity
*
* @return Activity
* @throws
*/
public Activity pop() {
if (mQueue != null && mQueue.size() > 0) {
return mQueue.peek();
} else {
return null;
}
}

/**
* pop the postion activity
*
* @return Activity
* @throws
*/
public Activity popIndex(int postion) {
if (mQueue != null && mQueue.size() > postion) {
return mQueue.get(postion);
} else {
return null;
}
}

/**
* finish all activity from queue
*
* @return void
* @throws
*/
public void finishAllActivity() {
mInstance.doFinishAll();
}

@SuppressLint("NewApi")
public void doPushActivity(Activity activity) {
// 解决系统2.2版本的bug
if (android.os.Build.VERSION.SDK_INT > Build.VERSION_CODES.FROYO) {
mQueue.push(activity);
} else {
mQueue.addFirst(activity);
}
}

public void doPopActivity(Activity activity) {
if (ActivityQueueManager.mQueue.contains(activity)) {
ActivityQueueManager.mQueue.remove(activity);
}
}

public void doFinishAll() {
Iterator<Activity> it = mQueue.iterator();
while (it.hasNext()) {
Activity a = it.next();
it.remove();
a.finish();
}
}

public static ActivityQueueManager getInstance() {
return mInstance;
}

public LinkedList<Activity> getActivityLinkQueue() {
return mQueue;
}

public int getSize() {
return mQueue.size();
}


/**
* 关闭N个activities
* @param closeNumberActivities 关闭activity的个数
*/
public void closeNumberActivities(int closeNumberActivities) {
// 关闭个数小于1的时候直接跳出
if (closeNumberActivities <= 0) {
return;
}
LinkedList<Activity> mActivities = mQueue;
if (mActivities != null && mActivities.size() <= 1) {
return;
}

try {
int countTemp = 0;
// 倒序遍历acitivty
for (int i = mActivities.size() - 1; i >= 0; i--) {
// 如果当前页面为NativeAppActivity,则直接finish();
Activity mActivity = mActivities.get(i);
if (mActivity != null ) {
mActivity.finish();
mActivities.remove(mActivity);
}
// 其他情况下finish掉activity
else {
// 当前页面不能是最后一页
if (mActivities.size() > 1 ) {
mActivity.finish();
mActivities.remove(mActivity);
countTemp ++;
} else {
i = -1;
}
}
// 退出循环
if (countTemp == closeNumberActivities) {
i = -1;
}
}
} catch (Exception e) {
e.printStackTrace();
}
}

}



下面就是调用过程了。只要我们在activity的onCreate方法中调用pushActivity添加,在onDestroy中调用popActivity移除即可。当然我们不会再每一个activity中都去做这个操作。

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
app = (LoveApplication) getApplication();
//添加
ActivityQueueManager.getInstance().pushActivity(this);

}

@Override
protected void onDestroy() {
super.onDestroy();
//移除
ActivityQueueManager.getInstance().popActivity(this);
}

其实我觉得这个框架的好处是:可以找到某个学要关闭的Activity将finish

0 0
原创粉丝点击