学习别人,加自己理解:

总结:

(1)standard:默认,每次startActivity()都会生成一个Activity实例。(一个栈,多个实例)

(2)singleTop:当此Activity在Task栈顶时,直接使用栈顶的此Activity的实例,不创建一个新的此Activity实例,否则,创建一个新的实例。(一个栈,多个实例)   

(3)singleTask: 在栈中只生成一个实例,可以被重复使用。(一个栈,一个实例)

(4)singleInstance:此模式下的Activity会单独开辟一个Task栈,此栈只包含这一个Activity。 在栈中只生成一个实例。(两个栈,一个实例) 

 

Activity有四种加载模式:

  • standard
  • singleTop
  • singleTask
  • singleInstance

(1)standard:默认模式,不需要配置launchMode,用一个application验证,如下:

package com.activitymode.test1;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Button;
import android.view.View;
import android.view.View.OnClickListener;
import android.util.Log;
public class ActivityModeTest1Activity extends Activity {
private Button btn1;
private static String TAG="ActivityModeTest1Activity";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn1 = (Button)findViewById(R.id.btn1);
btn1.setOnClickListener(listener1);
Log.v(TAG, "onCreate");
}
OnClickListener listener1= new OnClickListener(){

public void onClick(View arg0) {
// TODO Auto-generated method stub
Intent t = new Intent();
t.setClass(ActivityModeTest1Activity.this, ActivityModeTest1Activity.class);
startActivity(t);
}

};
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
Log.v(TAG, "######onDestroy");
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
Log.v(TAG, "#####onPause");
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
Log.v(TAG, "#####onResume");
}
@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
Log.v(TAG, "#####onStart");
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
Log.v(TAG, "#####onStop");
}

}

在xml中添加一个button即可,

运行结果:1:onCreate-->onStart-->onResume,显示一个button,点击button,发现界面会刷新一下,-->onPause-->

activity的实例2:onCreate-->onStart-->onResume-至此显示界面2->onStop-->(这里的onStop:1界面的看不见的周期)

再点一次,会刷新一下

,-->onPause-(界面2的)->

activity的实例3:onCreate-->onStart-->onResume-至此显示界面3->onStop-->(这里的onStop:2界面的看不见的周期)

 

点back,界面刷新一次,

,-->onPause-->(界面3)

显示activity实例2界面:onStart-->onResume-(至此显示界面2)->onStop-->onDestroy(界面3finish)

点back,界面刷新一次,

,-->onPause-->(界面2)

显示activity实例1界面:onStart-->onResume-至此显示界面1->onStop-->onDestroy(界面2finish)

点back,再点一次,

onPause-->onStop-->onDestroy

 

完毕。

(2)singleTop

singleTop和standard模式,都会将intent发送新的实例(后两种模式不发送到新的实例,如果已经有了的话)。

不过,singleTop要求如果创建intent的时候栈顶已经有要创建的Activity的实例,则将intent发送给该实例,而不发送给新的实例。singleTop模式,可用来解决栈顶多个重复相同的Activity的问题。

将launchMode改为singleTop,运行的时候会发现,按多少遍按钮,都是相同的ActivityModeTest1Activity 实例,因为该实例在栈顶,因此不会创建新的实例。如果回退,将退出应用。

 

如果是A Activity跳转到B Activity,再跳转到A Activity,行为就和standard一样了,会在B Activity跳转到A Activity的时候创建A Activity的新实例,因为当时的栈顶不是A Activity实例。

在AndroidManifest.xml中,加入 

<activity
            android:name=".ActivityModeTest1Activity"
            android:label="@string/app_name"
             android:launchMode="singleTop" >

运行周期如下:

onCreate-->onStart-->onResume,点击button,

onPause-->onResume,点击button,onPause-->onResume

点击back,onPause-->onStop-->onDestroy,

 

 

 

1--》2--》1

代码

package com.activitymode.test1;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Button;
import android.view.View;
import android.view.View.OnClickListener;
import android.util.Log;
public class ActivityModeTest2 extends Activity {
private Button btn2;
private static String TAG="ActivityModeTest1Activity";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main2);
btn2 = (Button)findViewById(R.id.btn2);
btn2.setOnClickListener(listener1);
this.getTaskId();
Log.v(TAG, "2222onCreate");
}
OnClickListener listener1= new OnClickListener(){

public void onClick(View arg0) {
// TODO Auto-generated method stub
Intent t = new Intent();
t.setClass(ActivityModeTest2.this, ActivityModeTest1Activity.class);
startActivity(t);
}

};
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
Log.v(TAG, "2222onDestroy");
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
Log.v(TAG, "2222onPause");
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
Log.v(TAG, "222onResume");
}
@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
Log.v(TAG, "2222onStart");
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
Log.v(TAG, "2222onStop");
}

}

 

1也是singleTop

<activity
            android:name=".ActivityModeTest2"
            android:launchMode="singleTop"></activity>

111onCreate--->111onStart-->1111onResume,点击button1(跳转到2),111onPause-->222onCreate-->222onStart-->222onResume-->111onStop-->点击button2(跳转到1),

222onPause-->111onCreate-->111onStart-->111onResume-->222onStop-->点击back

111onPause-->222onStart-->222onResume-->111onStop-->111onDestroy

点击back

222onPause-->111onStart-->111onResume-->222onStop-->2222onDestroy

点击back

1111onPause-->1111onStop-->1111onDestroy

界面不再显示,回到applications很多的那个界面。

(3)singleTask

singleTask模式和后面的singleInstance模式都是只创建一个实例的。

当intent到来,需要创建singleTask模式Activity的时候,系统会检查栈里面是否已经有该Activity的实例。如果有直接将intent发送给它。

把上面singleTop的实例中的ActivityModeTest1Activity 的launchMode改为singleTask,ActivityModeTest2 的改为standard。那么会发现在ActivityModeTest1Activity 界面中按一次按钮:

 

<activity
android:name=".ActivityModeTest1Activity"
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=".ActivityModeTest2"
android:launchMode
="singleTop"></activity>

111onCreate-->111onStart--->111onResume,显示1界面,

点击button1,跳转到2,(大顺序不变,略微调整显示顺序,不影响结果分析)111onPause-->111onStop--->222onCreate-->222onStart-->222onResume-->
点击button2,跳转到1,(此时2被销毁,与按back一样效果)

222onPause-->-->onStop-->222onDestroy-->111onStart-->111onResume

点击back

onPause-->onStop-->onDestroy.

此处,当2不管back,还是跳转到1;2都是被destroy了。

 

 

另一种:

  <activity
android:name=".ActivityModeTest1Activity"
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=".ActivityModeTest2"
android:launchMode
="standard"></activity>

把2变成standard,

只要不是前后挨着在同一个activity跳转,后面这个standard模式和singleTop模式,都是不管跳转还是back,都是把当前activity destroy。

111onCreate-->111onStart--->111onResume,显示1界面,点击button1,跳转到2,(大顺序不变,略微调整显示顺序,不影响结果分析)111onPause-->111onStop--->222onCreate-->222onStart-->222onResume-->,显示2界面,点击button2,跳转到1,222onPause-->222onStop--->--》onDestroy--》111onCreate-->111onStart-->111onResume-->

back,

111onPause-->111onStop-->111onDestroy

 

总结:只要前后在不同activity之间跳转,后者(B)不管模式是standard,SingleTop,还是SingTask;不管从B跳转到A,还是在B界面点击了back,B都会onDestroy

 

(4)singleInstance

 

posted on 2012-01-16 18:22  snowdrop  阅读(516)  评论(0编辑  收藏  举报