在Android中,每个Activity有4种LaunchMode,默认是standard,下面对这四种模式进行实例验证加深理解。
设计两个Activity,分别称为A,B,每个Activity上面都放置两个按钮,一个启动A,一个启动B。
界面如下:(上面的一行文字用来识别是在A界面还是在B界面)
在代码中实现onCreate():
- Button btnA = (Button)findViewById(R.id.btnA);
- btnA.setOnClickListener(new OnClickListener() {
- public void onClick(View v) {
-
- startActivity(new Intent(A.this, A.class));
- }
- });
-
- Button btnB = (Button)findViewById(R.id.btnB);
- btnB.setOnClickListener(new OnClickListener() {
- public void onClick(View v) {
-
- startActivity(new Intent(A.this, B.class));
- }
- });
-
- Log.e("Task:"+getTaskId(), "A" + mId + " created.");
onNewIntent():
- Log.e("Task:"+getTaskId(), "A" + mId + " onNewIntent.");
onDestroy():
- Log.e("Task:"+getTaskId(), "A" + mId + " destroyed.");
这样就可以直观的从Logcat输出中看到Activity的创建、销毁以及请求的响应。
1.两个Actiity的LaunchMode都为默认的standard,启动Ap,看到输出:
Task:9(380): A1 created.
A被创建了一个实例A1,并且放在了任务9中。
此时任务栈中内容为:
A
点击界面上启动A的按钮,看到输出:
Task:9(380): A2 created.
A再次被创建了一个新的实例A2,仍然放在任务9中。
此时任务栈中内容为:
AA
点击启动B的按钮,
Task:9(380): B1 created.
B被创建一个新的实例B1,仍然放在任务9中。
此时任务栈内容为:
AAB
再启动B,
Task:9(380): B2 created.
B又被创建了一个新的实例B2,仍然在任务9中。
任务栈内容为:
AABB
按Back键依次返回桌面,输出依次为:
Task:9(380): B2 destroyed.
Task:9(380): B1 destroyed.
Task:9(380): A2 destroyed.
Task:9(380): A1 destroyed.
任务栈的变化次序为:
AABB
AAB
AA
A
结论:
每个Intent,都创建了一个新的Activity来响应,并且Back时是按照弹栈的顺序处理的。
2.B设置为SingleTop,启动Ap:
Task:10(409): A1 created.
再启动A:
Task:10(409): A2 created.
再启动B:
Task:10(409): B1 created.
再启动B:
Task:10(409): B1 onNewIntent.
结论:
当B不在栈顶时,仍然会创建B的新实例。
当B在栈顶时,请求启动B的Intent并没有触发创建B的新实例,而是触发了栈顶B的onNewIntent()
按Back键依次返回桌面,输出依次为:
Task:10(409): B1 destroyed.
Task:10(409): A2 destroyed.
Task:10(409): A1 destroyed.
结论:
虽然发送了四次Intent,但实际上只创建了3个Activity,所以只有3次销毁输出。
3.B设置为SingleTask,启动Ap:
Task:11(438): A1 created.
启动B:
Task:11(438): B1 created.
启动A:
Task:11(438): A2 created.
启动B:
Task:11(438): B1 onNewIntent.
Task:11(438): A2 destroyed.
结论:
当B已经存在时,再次请求B会触发已经存在的B1实例的onNewIntent;
并且如果B所在的任务栈上面有其他Activity,那么其他Activity会被销毁。
4.B设置为SingleInstance,启动Ap:
Task:12(466): A1 created.
启动B,此时新创建了任务栈13,和先前的A1并不在一个任务。
Task:13(466): B1 created.
再启动B,没有创建新实例:
Task:13(466): B1 onNewIntent.
再启动A,再旧的任务12中创建了A的新实例
Task:12(466): A2 created.
按下Back键:
Task:12(466): A2 destroyed.
看输出和前面没区别,但是注意界面,此时不是切换到B界面,因为此时活动任务是12,所以A1被显示了出来。
再次按下Back键:
Task:12(466): A1 destroyed.
此时因为任务12已经结束,B1所在的任务13成为活动任务,B1的界面才被显示出来。
分享到:
相关推荐
在Android应用开发中,`Activity`是用户界面的基本单元,`launchMode`是每个`Activity`在`AndroidManifest.xml`中可配置的一个重要属性。它决定了`Activity`启动时的行为方式,对应用的流程和用户体验有直接影响。本...
总结来说,理解Activity的生命周期、熟练运用launchMode以及正确使用onActivityResult方法,对于编写稳定、高效、用户体验良好的Android应用至关重要。通过实际的代码测试和实验,开发者可以更好地掌握这些核心概念...
在Android应用开发中,`LaunchMode`是一个至关重要的概念,它定义了Activity如何启动和在任务栈中的行为。本测试实例将深入探讨Android的四种不同的`LaunchMode`:标准模式(standard)、单实例模式(singleInstance...
在实际开发中,我们可以通过在AndroidManifest.xml中为每个Activity定义`android:launchMode`属性来设置其TaskMode。同时,还可以通过Intent的Flag来临时改变Activity的启动行为,如`FLAG_ACTIVITY_NEW_TASK`和`FLAG...
快照的产生是通过PMS(Package Manager Service)来确认需要启动的Activity,并对intent、权限等进行验证,同时根据launchMode和flag配置task。 三、快照的销毁 快照的销毁是指在应用程序启动时,销毁之前的快照,...
在AndroidManifest.xml中,我们可以通过`android:launchMode`属性来设置Activity的启动模式。例如,为一个Activity设置单任务模式: ```xml <activity android:name=".MyActivity" android:launchMode="singleTask...
此外,还可能使用`android:launchMode`属性在AndroidManifest.xml中声明Activity的启动模式。 理解并熟练运用Activity的启动模式是优化Android应用体验和流程的关键。合理选择启动模式可以避免不必要的资源消耗,...
android:launchMode="singleTask" android:taskAffinity="" android:theme="@android:style/Theme.NoDisplay"> <action android:name="android.intent.action.MAIN" /> <category android:name="android....
android:launchMode="singleTask"> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category....
它们都需要设置特定的属性,如`android:noHistory`和`android:launchMode`,以确保正常运行。 - **配置Intent Filter**:为`AuthActivity`配置Intent Filter,指定`android:scheme`为“tencent 你的AppId”,这使得...
android:launchMode="singleTask"> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category....
android:launchMode="singleTask" /> ``` **二、初始化人人网SDK** 在应用启动时,进行人人网SDK的初始化,通常在Application或MainActivity的onCreate方法中: ```java RenrenSdkOptions options = new ...
8. **Activity 中两次调用 OnCreate**:可能是因为Activity被意外销毁并重新创建,或者使用了不正确的启动模式(launchMode)。 9. **ByteBuffer 和 FloatBuffer 分配**:直接分配(Direct Allocation)适用于跨...
同时,设置`<activity>`标签中的`android:launchMode`属性为“singleTask”,确保授权回调能正确处理。 步骤三:实现授权流程 在需要登录的地方,启动新浪的授权页面。通常这会是一个WebView,加载新浪的授权URL。...
android:launchMode="singleTop" android:name=".wxapi.WXEntryActivity" android:theme="@android:style/Theme.NoDisplay" /> ``` 当在`onResp`方法中接收到code后,你需要通过HTTP请求向微信服务器换取access_...
- 检查活动类名是否符合命名规范,如应为`<activity android:name=".Acitivity"></activity>`。 以上列举了一些常见的Android开发过程中可能会遇到的问题及其解决方案。希望这些内容能够帮助开发者们更快地定位和...
编写NFC程序的基本步骤包括设置权限、定义可接收Tag的Activity、配置launchMode属性等。 NFC技术有许多实际应用,如支付、门禁、身份验证等。 在Android开发中,NFC技术可以和其他技术结合使用,如蓝牙、Wi-Fi等,...
- `android:launchMode="singleTask"`:确保此活动始终处于任务栈的顶部。 - `android:noHistory="true"`:表明该活动不记录在历史记录中。 - `<intent-filter>`:定义了接收特定类型意图的过滤器。 - `<action ...