`
daojin
  • 浏览: 690291 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

ActivityGroup自我堆栈管理(复用现有activity)

 
阅读更多

密码管理请下载:

http://a.app.qq.com/o/simple.jsp?pkgname=com.wa505.kf.epassword

 

package com.dczs.activity;

import java.util.Stack;
import android.app.Activity;
import android.app.ActivityGroup;
import android.util.Log;
import android.view.KeyEvent;

public class BackStackActivityGroup extends ActivityGroup {

	private static final String TAG = "BackStackActivityGroup";

	private AcitivityStack mActivityStack = new AcitivityStack();

	public interface IActivityStack {

		void add(ActivityStatus name);

		void remove(String name);

		void pop();
	}

	public void onStackChange(AcitivityStack stack) {

	}

	public class AcitivityStack implements IActivityStack {

		public Stack<ActivityStatus> mStack = new Stack<ActivityStatus>();

		@Override
		public void add(ActivityStatus activityStackItem) {
			mStack.add(activityStackItem);
			onStackChange(this);
		}

		@Override
		public void remove(String name) {

			ActivityStatus theItem = null;

			for (ActivityStatus item : mStack) {
				if (item.name == name) {
					theItem = item;
					break;
				}
			}
			if (theItem != null) {
				mStack.remove(theItem);
				if (mStack.size() > 0) {
					mStack.peek().run();
				} else {
					getApplication().onTerminate();
				}
			}
			onStackChange(this);
		}

		@Override
		public void pop() {
			mStack.pop();
			if (mStack.size() > 0) {
				mStack.peek().run();
			} else {
				getApplication().onTerminate();
			}
			onStackChange(this);
		}

		public int size() {
			return mStack.size();
		}

		public String peek() {
			if (mStack.size() > 0 && mStack.peek() != null) {
				return mStack.peek().name;
			} else {
				return null;
			}
		}

	}

	public class ActivityStatus {

		private IActivityStack mActivityStack;

		private String name = "";

		private boolean mAddToStack = false;

		private Runnable runnable;

		private Activity activity;

		private ActivityStatus(IActivityStack activityStack) {
			mActivityStack = activityStack;
		}

		public void setRunnable(Runnable runnable) {
			this.runnable = runnable;
		}

		public void setName(String name) {
			this.name = name;
		}

		public ActivityStatus() {
		}

		public void addToBackStack() {
			mAddToStack = true;
		}

		public void run() {
			runnable.run();
			activity = getLocalActivityManager().getActivity(name);
		}

		public void commit() {
			if (mAddToStack) {
				mActivityStack.add(this);
			}
			runnable.run();
			activity = getLocalActivityManager().getActivity(name);
		}
	};

	public ActivityStatus startTransaction() {
		return new ActivityStatus(mActivityStack);
	}

	public AcitivityStack getActivityStack() {
		return mActivityStack;
	}

	/**
	 * Back event should not directly dispatch to the child views. Because when
	 * back key event dispatch to this activity's child views, if any of a child
	 * activity's sub views is taking focus. the child activity's
	 * {@link DecorView} will receive the event, and dispatch back key event to
	 * the child activity and call the child activity's onBackPressed method,
	 * this activity's onBackPressed will not be called. This activity's
	 * onBackPressed event will depend on the child activity's views' focus
	 * change.
	 * 
	 * @see {@link #onGlobalFocusChanged}.
	 */
	@Override
	public boolean dispatchKeyEvent(KeyEvent event) {
		Log.d(TAG, "dispatchKeyEvent... new ");
		if (event.getKeyCode() != KeyEvent.KEYCODE_BACK) {
			super.dispatchKeyEvent(event);
		} else {
			if (event.getAction() == KeyEvent.ACTION_UP) {
				onBackPressed();
			}
		}
		return true;
	}

	@Override
	public void onBackPressed() {
		Log.d(TAG, "onBackPressed... new ");
		Activity activity = getLocalActivityManager().getActivity(
				mActivityStack.peek());
		activity.onBackPressed();
	}

	@Override
	public void finishFromChild(Activity child) {
		// TODO Auto-generated method stub
		Log.d(TAG, "finishFromChild... new ");
		for (ActivityStatus item : mActivityStack.mStack) {
			Activity activity = getLocalActivityManager()
					.getActivity(item.name);
			if (activity == child) {
				// handled the finish command.
				Log.d(TAG, "finishFromChild... is Finishing is true");
				AcitivityStack stack = getActivityStack();
				stack.remove(item.name);
			}
		}
	}
}

 

1
0
分享到:
评论

相关推荐

    用ActivityGroup解决TabHost中多个Activity跳转问题

    这样,在TabHost中,我们可以创建一个包含多个子Activity的ActivityGroup,而不是创建多个独立的Activity,从而简化了回退栈的管理和内存管理。 具体实现ActivityGroup的方法包括: 1. **定义ActivityGroup**:...

    使用ActivityGroup管理Activity

    然而,有时开发者可能需要在同一个栈中管理多个Activity,这时`ActivityGroup`就派上了用场。`ActivityGroup`是早期Android版本(Android 2.x)提供的一种特殊类型的`ViewGroup`,允许在同一个`TabHost`或`...

    使用ActivityGroup来切换Activity和Layout

    `ActivityGroup`是`Sherlock`库中的一个类,它扩展了`Activity`,并提供了管理子`Activity`的能力。通过`LocalActivityManager`,我们可以启动、切换和管理子`Activity`,同时保持它们的状态。 在实现过程中,我们...

    ActivityGroup实现Activit栈

    在Android开发中,ActivityGroup是早些版本API中提供的一种特殊类型的Activity,它允许开发者在一个TabHost或者帧布局(FrameLayout)中嵌套多个Activity,从而实现类似iOS中UINavigationController的堆叠管理器效果...

    ActivityGroup之Activity内跳转和外跳转

    这个过程通常需要重写`startChildActivity()`方法,以便在ActivityGroup内部管理子Activity的生命周期。例如: ```java public void startChildActivity(String tag, Intent intent) { Window window = ...

    Android开发—使用ActivityGroup来切换Activity和Layout.pdf

    在Android开发中,ActivityGroup是一种特殊类型的Activity,它允许开发者在一个Activity内嵌套其他Activity,实现类似TabHost或Fragment的效果,但这是在Android早期版本(API级别较低)中的一种实现方式。...

    Android Gallery+ActivityGroup实现滑动TAB独立Activity

    2. 创建ActivityGroup:定义一个继承自ActivityGroup的类,用于管理子Activity。你需要重写onCreateView方法来返回子Activity的视图,以及onSaveInstanceState和onRestoreInstanceState来保存和恢复子Activity的状态...

    Android开发—使用ActivityGroup来切换Activity和Layout

    为了实现这个功能,我们可以使用 ActivityGroup 来管理不同的 Activity。 首先,让我们来了解一下 ActivityGroup 的概念。ActivityGroup 是 Android 中的一种特殊的 Activity,它可以容纳多个 Activity,并且可以在...

    android ActivityGroup的demo

    1. **LocalActivityManager**:这是ActivityGroup的核心组件,用于管理子Activity的创建、销毁以及保存和恢复状态。通过LocalActivityManager,我们可以方便地在ActivityGroup内启动新的子Activity,并在需要时切换...

    ActivityGroup之activity内跳转和外跳转

    这通常通过自定义的启动方法实现,如`startChildActivity()`,在该方法中,你需要管理Activity的生命周期,并将新Activity的视图添加到ActivityGroup的布局中。 Activity外跳转则是指从ActivityGroup中的子Activity...

    activitygroup

    `ActivityGroup`在早期的Android版本中被用来解决在同一个栈内管理多个`Activity`的需求,但在Android 3.0(API Level 11)之后,官方推荐使用`Fragment`来替代,因为`Fragment`提供了更灵活且性能更好的解决方案。...

    Android TabHost内嵌ActivityGroup界面管理源码.rar

    接着,ActivityGroup是一个特殊的Activity,它可以包含并管理多个子Activity。在ActivityGroup内部,我们可以使用LocalActivityManager来管理子Activity的生命周期。通过startActivity和addWindow方法,可以在...

    tabhost和ActivityGroup的组合使用

    在早期的Android版本中,ActivityGroup用于在一个Tab内管理多个Activity的堆栈。它的主要作用是在不离开TabHost的情况下,实现内部Activity的切换和堆栈管理。然而,从Android 3.0(API级别11)开始,ActivityGroup...

    ActivityGroup应用-如何把一个Activity加载成一个视图

    ActivityGroup是android.app.LocalActivityManager的包装器,它允许你管理一组内部的Activity。在早期版本的Android中,开发者可能会用ActivityGroup来实现类似TabHost的功能,或者创建复杂的视图层次结构。下面我们...

    Android源码——TabHost内嵌ActivityGroup界面管理源码_new_17.7z

    4. 子Activity的生命周期管理:由于ActivityGroup内嵌了Activity,所以必须手动处理子Activity的生命周期。例如,当用户在选项卡之间切换时,需要调用finish()方法结束当前子Activity,并启动新的子Activity。 5. ...

    AndroidTabHost内嵌ActivityGroup界面管理源码.zip

    4. 创建ActivityGroup:为每个Tab创建一个ActivityGroup,通常在onCreate()方法中,会设置一个LocalActivityManager来管理子Activity。 5. 添加子Activity:在ActivityGroup中,通过LocalActivityManager的start...

    安卓Android源码——TabHost内嵌ActivityGroup界面管理源码.zip

    ActivityGroup是另一种用于管理多个Activity的容器类,它允许你在同一个父Activity中启动和管理子Activity。这在某些情况下非常有用,例如在一个应用中创建类似TabHost的多页面导航,但又希望避免每次切换标签时都...

    ActivityGroup应用实例

    5. **生命周期管理**:ActivityGroup内的子Activity生命周期需要特别注意,因为它们的创建和销毁由LocalActivityManager控制,开发者需要确保正确处理每个子Activity的生命周期回调。 6. **异常处理和回退栈管理**...

    统一管理Activity,每个Activity又相对独立

    ActivityGroup是Android早期版本(API Level 13之前)提供的一种方式,用来在TabHost或者StackView等组件中嵌套管理Activity。它允许你在同一个窗口内启动和切换多个子Activity,使得这些子Activity看起来像是在一...

    Android源码——TabHost内嵌ActivityGroup界面管理源码_new_17.zip

    ActivityGroup则是Android早期版本中用于在同一个Activity内管理多个子Activity的一种方式。它通过LocalActivityManager来实现子Activity的生命周期管理和界面切换。ActivityGroup的主要优势在于可以减少界面间的...

Global site tag (gtag.js) - Google Analytics