`
kongweile
  • 浏览: 517372 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Android Activity LaunchMode 验证

 
阅读更多

在Android中,每个Activity有4种LaunchMode,默认是standard,下面对这四种模式进行实例验证加深理解。 


设计两个Activity,分别称为A,B,每个Activity上面都放置两个按钮,一个启动A,一个启动B。 

界面如下:(上面的一行文字用来识别是在A界面还是在B界面) 
 

在代码中实现onCreate(): 

Java代码  收藏代码
  1. Button btnA = (Button)findViewById(R.id.btnA);  
  2.         btnA.setOnClickListener(new OnClickListener() {           
  3.             public void onClick(View v) {  
  4.                 // TODO Auto-generated method stub  
  5.                 startActivity(new Intent(A.this, A.class));  
  6.             }  
  7.         });  
  8.           
  9.         Button btnB = (Button)findViewById(R.id.btnB);  
  10.         btnB.setOnClickListener(new OnClickListener() {           
  11.             public void onClick(View v) {  
  12.                 // TODO Auto-generated method stub  
  13.                 startActivity(new Intent(A.this, B.class));  
  14.             }  
  15.         });  
  16.           
  17.         Log.e("Task:"+getTaskId(), "A" + mId + " created.");   



onNewIntent(): 
Java代码  收藏代码
  1. Log.e("Task:"+getTaskId(), "A" + mId + " onNewIntent.");  


onDestroy(): 
Java代码  收藏代码
  1. Log.e("Task:"+getTaskId(), "A" + mId + " destroyed.");  


这样就可以直观的从Logcat输出中看到Activity的创建、销毁以及请求的响应。 

1.两个Actiity的LaunchMode都为默认的standard,启动Ap,看到输出: 
Task:9(380): A1 created. 

A被创建了一个实例A1,并且放在了任务9中。 
此时任务栈中内容为: 


点击界面上启动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 


结论: 
每个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的界面才被显示出来。 

分享到:
评论

相关推荐

    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