`

如何保证Activity实例个数唯一(Activity启动模式)

阅读更多
ActA.java文件:
public class ActA extends Activity {
	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		TextView textView = new TextView(this);
		/**
		 * standard 模式:
		 * <p>
		 * 当使用当前代码块启动Activity时,每次都是新创建了一个Activity实例.
		 * 因为是使用默认启动模式(标准模式),我们可以通过下面TextView文本中 hash code 来识别是否为新Activity
		 * 此时点击back可以依次看到先前启动的Activity实例,类似栈退出操作,而启动过程类似压栈操作
		 * 
		 * singleTop 模式:
		 * <p>
		 * 运行的时候会发现,按多少遍按钮,都是相同的ActiA实例,因为该实例在栈顶,因此不会创建新的实例.如果回退,将退出应用
		 * singleTop模式,可用来解决栈顶多个重复相同的Activity的问题.如果是A Activity跳转到B Activity,再跳转到
		 * A Activity,行为就和standard一样了,会在B Activity跳转到A Activity的时候创建A
		 * Activity的新实例,因为当时的 栈顶不是A Activity实例
		 * 
		 * singleTask 模式:
		 * <p>
		 * 当intent到来,需要创建singleTask模式Activity的时候,系统会检查栈里面是否已经有该Activity的实例
		 * .如果有直接将 intent发送给它.
		 * 
		 * singleInstance模式:
		 * <p>
		 * 首先要说一下Task的概念.如果是Swing或者Windows程序,可能有多个窗口可以切换,但是你无法在自己程序中复用人家的窗口.
		 * 注意是直接复用人家的二进制代码,不是你拿到人家api后的源代码级调用.Android可以做到,让别人的程序直接复用你的
		 * Activity(类似桌面程序的窗口).Android为提供这种机制,就引入了Task的概念.
		 * <p>
		 * Task可以认为是一个栈,可放入多个Activity.比如启动一个应用,那么Android就创建了一个Task,
		 * 然后启动这个应用的入口Activity
		 * ,就是intent-filter中配置为main和launch的那个(见一个APK文件部署产生多个应用安装
		 * 的效果)这个Activity是根
		 * (Root)Activity,可能会在它的界面调用其他Activity,这些Activity如果按照上面那三个模式
		 * ,也会在这个栈(Task)中,只是实例化的策略不同而已. 验证的办法是调用和打印Activity的taskId:   
		 * <p>
		 * TextView textView2 = new TextView(this);
		 * textView2.setText("task id: "+this.getTaskId());
		 * 会发现,无论切换Activity,taskId是相同的
		 * 
		 * 当然也可以在这个单一的Task栈中,放入别人的Activity,比如google地图,这样用户看过地图按回退键的时候,
		 * 会退栈回到调用地图的Activity.对用户来说,并不觉得在操作多个应用.这就是Task的作用.
		 * 
		 * 但是,有这样的需求,多个Task共享一个Activity(singleTask是在一个task中共享一个Activity)
		 * 现成的例子是google地图.比如我有一个应用是导游方面的,其中调用的google地图Activity.那么现在我比如按home键,
		 * 然后到应用列表中打开google地图,你会发现显示的就是刚才的地图,实际上是同一个Activity.
		 * 
		 * 如果使用上面三种模式,是无法实现这个需求的.google地图应用中有多个上下文Activity,比如路线查询等的,
		 * 导游应用也有一些上下文Activity.在各自应用中回退要回退到各自的上下文Activity中
		 * 
		 * singleInstance模式解决了这个问题(绕了这么半天才说到正题),让这个模式下的Activity单独在一个task栈中.
		 * 这个栈只有一个Activity.导游应用和google地图应用发送的intent都由这个Activity接收和展示.
		 * 
		 * 这里又有两个问题:
		 * <p>
		 * 如果是这种情况,多个task栈也可以看作一个应用.比如导游应用启动地图Activity,
		 * 实际上是在导游应用task栈之上singleInstance模式创建的
		 * (如果还没有的话,如果有就是直接显示它)一个新栈,当这个栈里面的唯一Activity
		 * ,地图Activity回退的时候,只是把这个栈移开了,
		 * 这样就看到导游应用刚才的Activity了;多个应用(Task)共享一个Activity要求这些应用都没有退出
		 * ,比如刚才强调要用home键从导游应用切换到地图应用.因为,如果退出导游应用
		 * .而这时地图应用也并未运行的话,那个单独的地图Activity(task)也会退出了
		 * 
		 * 如果还是拿刚才的ActA和ActB的示例,可以把ActB的模式改为singleInstance,ActA为standard,进行一下测试
		 */
		textView.setText("Activity id:" + this + "task Id:" + this.getTaskId());
		Button button = new Button(this);
		button.setText("go ActB");
		button.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				Intent intent = new Intent();
				intent.setClass(ActA.this, ActB.class);
				startActivity(intent);
			}
		});
		LinearLayout layout = new LinearLayout(this);
		layout.setOrientation(LinearLayout.VERTICAL);
		layout.addView(textView);
		layout.addView(button);
		this.setContentView(layout);
	}
}

ActB.java文件:
public class ActB extends Activity {
	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		TextView textView = new TextView(this);
		textView.setText("Activity id:" + this + "task Id:" + this.getTaskId());
		Button button = new Button(this);
		button.setText("go actA");
		button.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				Intent intent = new Intent();
				intent.setClass(ActB.this, ActA.class);
				startActivity(intent);
			}
		});
		LinearLayout layout = new LinearLayout(this);
		layout.setOrientation(LinearLayout.VERTICAL);
		layout.addView(textView);
		layout.addView(button);
		this.setContentView(layout);
	}
	
	protected void onDestory(){
		super.onDestroy();
		System.out.println("____B ondestory_____");
	}

}


AndroidMenifest.xml文件(配置启动模式):
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
	package="com.example.model" android:versionCode="1"
	android:versionName="1.0">
	<application android:icon="@drawable/icon" android:label="@string/app_name">
		<activity android:name=".ActA" android:label="@string/app_name"
			android:launchMode="singleTask">
			<intent-filter>
				<action android:name="android.intent.action.MAIN" />
				<category android:name="android.intent.category.LAUNCHER" />
			</intent-filter>
		</activity>
		<activity android:name=".ActB" android:launchMode="singleInstance" />
	</application>
</manifest> 


这个url写下供自己参考,当然大伙都可以链过去学习学习:

http://winuxxan.blog.51cto.com/2779763/504047
分享到:
评论

相关推荐

    Activity启动模式实例

    Activity启动模式是Android系统管理Activity实例的重要机制,它决定了当用户点击一个应用或在应用内部进行跳转时,如何创建和管理Activity的生命周期。本示例项目"Activity启动模式实例"深入探讨了四种主要的...

    Activity生命周期 启动模式实例

    2. **单实例模式(SingleInstance)**:只有一个Activity实例存在于整个系统,无论多少次启动,都只会返回这个唯一的实例。其他Activity无法与该实例在同一任务栈中。 3. **单任务模式(SingleTask)**:每次启动...

    activity启动模式测试

    标准模式是最常见的Activity启动模式,每个启动请求都会创建一个新的Activity实例。如果新的实例被叠加到栈顶,那么它会覆盖之前显示的Activity。这种模式适用于大部分Activity,因为它允许灵活的导航和回退操作,...

    Activity四种启动模式

    标准模式是最常见的Activity启动模式,每个启动请求都会创建一个新的Activity实例。如果新的实例被压入到栈顶,那么就会出现多个相同实例的情况。这种模式适用于大多数Activity,因为它们通常不需要特殊的行为管理...

    Activity启动模式demo

    在栈顶检测到已有该Activity实例时,不会创建新的实例,而是重用栈顶的实例,同时调用onNewIntent()方法传递新的Intent。这适用于需要接收广播或持续处理事件,但不希望每次都创建新实例的情况。 5. **启动模式的...

    Activity启动模式实验代码

    而一些需要独立处理业务的Activity,如登录界面,可能会采用标准模式,保证每次启动都是新的实例。 总之,理解并掌握Activity的启动模式,能够帮助开发者更灵活地控制应用的流程,提升用户体验。通过实验代码的实践...

    android Activity 四种启动模式例子

    因此,标准模式可能导致多个相同Activity实例存在于栈中。 2. singleTop(单顶模式) 当Activity设置为singleTop时,如果它在任务栈的顶部已经存在,那么新的启动请求不会创建新的实例,而是重用现有的实例。但是,...

    activity的四种启动模式

    在standard模式下,每当用户通过意图(Intent)启动Activity时,系统都会创建一个新的Activity实例并将其添加到当前任务的任务栈中。这意味着,如果用户多次启动同一个Activity,任务栈中将会有多个该Activity的实例...

    Activity生命周期与启动模式

    2. **单例模式(singleTop)**:如果Activity实例已经位于栈顶,那么新的启动请求不会创建新的实例,而是复用栈顶的实例,同时调用`onNewIntent()`方法传递新意图。 3. **单任务模式(singleTask)**:这种模式下,...

    android activity启动模式详解

    standard是最常见的启动模式,每个启动请求都会创建一个新的Activity实例。如果栈中已有该Activity的实例,那么新的实例会被压入栈顶。这种模式适合那些每次启动都需要新实例的Activity,例如主屏幕或者登录页面。 ...

    Activity的启动模式

    - **FLAG_ACTIVITY_SINGLE_TOP**:这个标志与singleTop模式类似,但通常用于Intent中,强制Activity不创建新实例,而是使用栈顶的实例,即使这个模式不是Activity的默认启动模式。 了解并合理使用这些启动模式,...

    activity四种启动模式

    这是Activity的默认启动模式,每次启动时都会创建一个新的Activity实例。无论是在当前任务栈中还是其他任务栈中,只要启动了该Activity,就会生成新的实例。如果目标Activity已经在栈中,系统仍然会创建新的实例并放...

    Android中Activity启动模式demo

    在“ActivityLaunchModeDemo”项目中,开发者可以体验到每种启动模式的实际效果,通过查看和分析task ID和Activity实例,了解不同模式下Activity如何被创建和管理。通过实践,开发者可以更好地理解和掌握如何根据...

    android activity4种启动模式测试

    标准模式是Activity的默认启动模式,每次启动都会创建一个新的Activity实例。如果栈中已经存在该Activity,那么系统会将新的实例压入栈顶,形成多个实例。这种模式适用于大多数情况,但可能导致内存消耗增加。 2. ...

    Activity四种启动模式Demo

    Activity的启动模式(LaunchMode)是Android系统管理和控制Activity实例的关键特性,它决定了Activity如何响应用户的操作以及系统如何创建和管理Activity的实例。本示例代码详细展示了Activity的四种启动模式:标准...

    Android中Activity的四种启动模式案例

    单栈顶模式与标准模式类似,每次启动都会创建新的Activity实例,但有一个关键区别:如果目标Activity已经在栈顶,系统不会创建新的实例,而是重用已有的。这就避免了创建不必要的Activity实例,提高了性能。例如,...

    activity的启动方式

    首次启动时,系统会创建一个新的任务,并在此任务中创建Activity实例。如果已存在该Activity的实例,系统会将当前任务跳转到该实例所在的任务,并清除该任务栈中位于它之上的所有Activity。这常用于主屏幕或者导航...

    Android各种超炫特效 Activity启动模式

    当启动一个SingleTask模式的Activity时,如果任务栈中不存在该Activity,则创建一个新的任务栈,并在其底部创建Activity实例。如果任务栈已存在该Activity,系统会将该任务栈上方的所有Activity出栈,然后调用...

Global site tag (gtag.js) - Google Analytics