`
mypyg
  • 浏览: 549644 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Android Activity LaunchMode 验证

阅读更多
在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) {
				// TODO Auto-generated method stub
				startActivity(new Intent(A.this, A.class));
			}
		});
        
        Button btnB = (Button)findViewById(R.id.btnB);
        btnB.setOnClickListener(new OnClickListener() {			
			public void onClick(View v) {
				// TODO Auto-generated method stub
				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的界面才被显示出来。




  • 大小: 7.6 KB
6
0
分享到:
评论
3 楼 xyg1990 2012-02-24  
listItem.add(map);
2 楼 George_ghc 2011-08-07  
以前看过一遍 没有很认真的看,这次又看了一遍终于明白了!
看来知识 要记牢啊!
1 楼 qiaoweishu 2011-02-28  
这才叫学问,研究学问!

相关推荐

    Activity的launchMode测试

    在Android应用开发中,`Activity`是用户界面的基本单元,`launchMode`是每个`Activity`在`AndroidManifest.xml`中可配置的一个重要属性。它决定了`Activity`启动时的行为方式,对应用的流程和用户体验有直接影响。本...

    android之activity的生命周期和launchMode、onActivityResult方法的作用

    总结来说,理解Activity的生命周期、熟练运用launchMode以及正确使用onActivityResult方法,对于编写稳定、高效、用户体验良好的Android应用至关重要。通过实际的代码测试和实验,开发者可以更好地掌握这些核心概念...

    android LaunchMode测试实例

    在Android应用开发中,`LaunchMode`是一个至关重要的概念,它定义了Activity如何启动和在任务栈中的行为。本测试实例将深入探讨Android的四种不同的`LaunchMode`:标准模式(standard)、单实例模式(singleInstance...

    Android Activity的4种TaskMode

    在实际开发中,我们可以通过在AndroidManifest.xml中为每个Activity定义`android:launchMode`属性来设置其TaskMode。同时,还可以通过Intent的Flag来临时改变Activity的启动行为,如`FLAG_ACTIVITY_NEW_TASK`和`FLAG...

    Android Activity打开后被应用快照遮住的问题

    快照的产生是通过PMS(Package Manager Service)来确认需要启动的Activity,并对intent、权限等进行验证,同时根据launchMode和flag配置task。 三、快照的销毁 快照的销毁是指在应用程序启动时,销毁之前的快照,...

    Activity启动模式之代码验证

    在AndroidManifest.xml中,我们可以通过`android:launchMode`属性来设置Activity的启动模式。例如,为一个Activity设置单任务模式: ```xml <activity android:name=".MyActivity" android:launchMode="singleTask...

    Activity启动模式

    此外,还可能使用`android:launchMode`属性在AndroidManifest.xml中声明Activity的启动模式。 理解并熟练运用Activity的启动模式是优化Android应用体验和流程的关键。合理选择启动模式可以避免不必要的资源消耗,...

    Android密码锁屏的实现,解决Home,Back问题

    android:launchMode="singleTask" android:taskAffinity="" android:theme="@android:style/Theme.NoDisplay"> <action android:name="android.intent.action.MAIN" /> <category android:name="android....

    android微信分享

    android:launchMode="singleTask"> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category....

    SDK配置说明文档_Android1

    它们都需要设置特定的属性,如`android:noHistory`和`android:launchMode`,以确保正常运行。 - **配置Intent Filter**:为`AuthActivity`配置Intent Filter,指定`android:scheme`为“tencent 你的AppId”,这使得...

    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 人人网分享

    android:launchMode="singleTask" /> ``` **二、初始化人人网SDK** 在应用启动时,进行人人网SDK的初始化,通常在Application或MainActivity的onCreate方法中: ```java RenrenSdkOptions options = new ...

    自己平时做的android相关的总结

    8. **Activity 中两次调用 OnCreate**:可能是因为Activity被意外销毁并重新创建,或者使用了不正确的启动模式(launchMode)。 9. **ByteBuffer 和 FloatBuffer 分配**:直接分配(Direct Allocation)适用于跨...

    新浪微博第三方登录授权

    同时,设置`<activity>`标签中的`android:launchMode`属性为“singleTask”,确保授权回调能正确处理。 步骤三:实现授权流程 在需要登录的地方,启动新浪的授权页面。通常这会是一个WebView,加载新浪的授权URL。...

    Android实现使用微信登录第三方APP的方法

    android:launchMode="singleTop" android:name=".wxapi.WXEntryActivity" android:theme="@android:style/Theme.NoDisplay" /> ``` 当在`onResp`方法中接收到code后,你需要通过HTTP请求向微信服务器换取access_...

    android常见错误

    - 检查活动类名是否符合命名规范,如应为`<activity android:name=".Acitivity"></activity>`。 以上列举了一些常见的Android开发过程中可能会遇到的问题及其解决方案。希望这些内容能够帮助开发者们更快地定位和...

    深入分析Android NFC技术 android nfc开发

    编写NFC程序的基本步骤包括设置权限、定义可接收Tag的Activity、配置launchMode属性等。 NFC技术有许多实际应用,如支付、门禁、身份验证等。 在Android开发中,NFC技术可以和其他技术结合使用,如蓝牙、Wi-Fi等,...

    第三方登录

    - `android:launchMode="singleTask"`:确保此活动始终处于任务栈的顶部。 - `android:noHistory="true"`:表明该活动不记录在历史记录中。 - `<intent-filter>`:定义了接收特定类型意图的过滤器。 - `<action ...

Global site tag (gtag.js) - Google Analytics