学习别人,加自己理解:
总结:
(1)standard:默认,每次startActivity()都会生成一个Activity实例。(一个栈,多个实例)
(2)singleTop:当此Activity在Task栈顶时,直接使用栈顶的此Activity的实例,不创建一个新的此Activity实例,否则,创建一个新的实例。(一个栈,多个实例)
(3)singleTask: 在栈中只生成一个实例,可以被重复使用。(一个栈,一个实例)
(4)singleInstance:此模式下的Activity会单独开辟一个Task栈,此栈只包含这一个Activity。 在栈中只生成一个实例。(两个栈,一个实例)
Activity有四种加载模式:
(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