Android Activity的4种启动模式详解(代码+截图)
来源:互联网 发布:js入门教程视频 编辑:程序博客网 时间:2024/06/05 16:27
最近研究android内核,学习到android activity的启动模式,掌握好启动模式,对activity的处理例如关闭和开启,以及数据间的传输有很大的帮助。
看此博文前,请花点时间先看一下一个博主写的:http://www.cnblogs.com/lwbqqyumidi/p/3771542.html,有助于下面理解。。
我们同4个activity的启动来看其中的原理。。。。。。
下面是xml文件(很简单):
first.xml
其他的类似。。。。
通过standard启动:
4个activity的定义:
public class Activity1 extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Log.v("Standard", "activity1 oncreate");setContentView(R.layout.first);TextView textView=(TextView) findViewById(R.id.textView1);TextView textIdView=(TextView) findViewById(R.id.textIdView1);textView.setText(this.toString());textIdView.setText("current task id:"+this.getTaskId());Button bt=(Button) findViewById(R.id.button1);bt.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent=new Intent(Activity1.this,Activity2.class);startActivity(intent);}});}@Overrideprotected void onStart() {super.onStart();Log.v("Standard", "activity1 onStart");}@Overrideprotected void onPause() {super.onPause();Log.v("Standard", "activity1 onPause");}@Overrideprotected void onStop() {super.onStop();Log.v("Standard", "activity1 onStop");}@Overrideprotected void onDestroy() {super.onDestroy();Log.v("Standard", "activity1 onDestroy");}}
public class Activity2 extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.second);Log.v("SingleInstance", "activity2 oncreate");TextView textView=(TextView) findViewById(R.id.textView2);TextView textIdView=(TextView) findViewById(R.id.textIdView2);textView.setText(this.toString());textIdView.setText("current task id:"+this.getTaskId());Button bt = (Button) findViewById(R.id.button2);bt.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(Activity2.this, Activity3.class);startActivity(intent);}});}@Overrideprotected void onStart() {super.onStart();Log.v("SingleInstance", "activity2 onStart");}@Overrideprotected void onPause() {super.onPause();Log.v("SingleInstance", "activity2 onPause");}@Overrideprotected void onStop() {super.onStop();Log.v("SingleInstance", "activity2 onStop");}@Overrideprotected void onDestroy() {super.onDestroy();Log.v("SingleInstance", "activity2 onDestroy");}}
public class Activity3 extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.third);Log.v("SingleInstance", "activity3 oncreate");TextView textView=(TextView) findViewById(R.id.textView3);TextView textIdView=(TextView) findViewById(R.id.textIdView3);textView.setText(this.toString());textIdView.setText("current task id:"+this.getTaskId());Button bt = (Button) findViewById(R.id.button3);bt.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(Activity3.this, Activity4.class);startActivity(intent);}});}@Overrideprotected void onStart() {super.onStart();Log.v("SingleInstance", "activity3 onStart");}@Overrideprotected void onPause() {super.onPause();Log.v("SingleInstance", "activity3 onPause");}@Overrideprotected void onStop() {super.onStop();Log.v("SingleInstance", "activity3 onStop");}@Overrideprotected void onDestroy() {super.onDestroy();Log.v("SingleInstance", "activity3 onDestroy");}}
public class Activity4 extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.forth);Log.v("SingleInstance", "activity4 oncreate");TextView textView = (TextView) findViewById(R.id.textView4);TextView textIdView = (TextView) findViewById(R.id.textIdView4);textView.setText(this.toString());textIdView.setText("current task id:"+this.getTaskId());Button bt = (Button) findViewById(R.id.button4);//bt.setText("forth go to forth");bt.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//Intent intent = new Intent(Activity4.this, Activity4.class);Intent intent = new Intent(Activity4.this, Activity1.class);startActivity(intent);}});}@Overrideprotected void onStart() {super.onStart();Log.v("SingleInstance", "activity4 onStart");}@Overrideprotected void onPause() {super.onPause();Log.v("SingleInstance", "activity4 onPause");}@Overrideprotected void onStop() {super.onStop();Log.v("SingleInstance", "activity4 onStop");}@Overrideprotected void onDestroy() {super.onDestroy();Log.v("SingleInstance", "activity4 onDestroy");}}AndroidManifest.xml的配置:
<!-- standard --> <activity android:name="pers.running203.androidlaunchmodetest.standard.activity.Activity1"> <intent-filter > <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> <activity android:name="pers.running203.androidlaunchmodetest.standard.activity.Activity2"></activity> <activity android:name="pers.running203.androidlaunchmodetest.standard.activity.Activity3"></activity> <activity android:name="pers.running203.androidlaunchmodetest.standard.activity.Activity4"></activity>
我们通过其打出来的日志来分析通过standard模式启动的过程:
启动顺序:
activity1->activity2->activity3->activity4->activity1
返回退出:
总结:activity的启动模式如果使用standard,那么每启动一个activity就会生成一个activity对象,将每个activity入栈,后退关闭时,需要一个个返回关闭,最先启动的最后关闭。
通过singleTop启动:
4个activity的定义:
public class Activity1 extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Log.v("SingleTop", "activity1 oncreate");setContentView(R.layout.first);TextView textView=(TextView) findViewById(R.id.textView1);TextView textIdView=(TextView) findViewById(R.id.textIdView1);textView.setText(this.toString());textIdView.setText("current task id:"+this.getTaskId());Button bt=(Button) findViewById(R.id.button1);bt.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent=new Intent(Activity1.this,Activity2.class);startActivity(intent);}});}@Overrideprotected void onStart() {super.onStart();Log.v("SingleTop", "activity1 onStart");}@Overrideprotected void onPause() {super.onPause();Log.v("SingleTop", "activity1 onPause");}@Overrideprotected void onStop() {super.onStop();Log.v("SingleTop", "activity1 onStop");}@Overrideprotected void onDestroy() {super.onDestroy();Log.v("SingleTop", "activity1 onDestroy");}}
public class Activity2 extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.second);Log.v("SingleTop", "activity2 oncreate");TextView textView=(TextView) findViewById(R.id.textView2);TextView textIdView=(TextView) findViewById(R.id.textIdView2);textView.setText(this.toString());textIdView.setText("current task id:"+this.getTaskId());Button bt = (Button) findViewById(R.id.button2);bt.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(Activity2.this, Activity3.class);startActivity(intent);}});}@Overrideprotected void onStart() {super.onStart();Log.v("SingleTop", "activity2 onStart");}@Overrideprotected void onPause() {super.onPause();Log.v("SingleTop", "activity2 onPause");}@Overrideprotected void onStop() {super.onStop();Log.v("SingleTop", "activity2 onStop");}@Overrideprotected void onDestroy() {super.onDestroy();Log.v("SingleTop", "activity2 onDestroy");}}
public class Activity3 extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.third);Log.v("SingleTop", "activity3 oncreate");TextView textView=(TextView) findViewById(R.id.textView3);TextView textIdView=(TextView) findViewById(R.id.textIdView3);textView.setText(this.toString());textIdView.setText("current task id:"+this.getTaskId());Button bt = (Button) findViewById(R.id.button3);bt.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(Activity3.this, Activity4.class);startActivity(intent);}});}@Overrideprotected void onStart() {super.onStart();Log.v("SingleTop", "activity3 onStart");}@Overrideprotected void onPause() {super.onPause();Log.v("SingleTop", "activity3 onPause");}@Overrideprotected void onStop() {super.onStop();Log.v("SingleTop", "activity3 onStop");}@Overrideprotected void onDestroy() {super.onDestroy();Log.v("SingleTop", "activity3 onDestroy");}}
public class Activity4 extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.forth);Log.v("SingleTop", "activity4 oncreate");TextView textView = (TextView) findViewById(R.id.textView4);TextView textIdView = (TextView) findViewById(R.id.textIdView4);textView.setText(this.toString());textIdView.setText("current task id:"+this.getTaskId());Button bt = (Button) findViewById(R.id.button4);bt.setText("forth go to forth");bt.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(Activity4.this, Activity4.class);startActivity(intent);}});}@Overrideprotected void onStart() {super.onStart();Log.v("SingleTop", "activity4 onStart");}@Overrideprotected void onPause() {super.onPause();Log.v("SingleTop", "activity4 onPause");}@Overrideprotected void onStop() {super.onStop();Log.v("SingleTop", "activity4 onStop");}@Overrideprotected void onDestroy() {super.onDestroy();Log.v("SingleTop", "activity4 onDestroy");}}AndroidManifest.xml的配置:
<!--singleTop --> <activity android:launchMode="singleTop" android:name="pers.running203.androidlaunchmodetest.singletop.activity.Activity1"> <intent-filter > <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> <activity android:launchMode="singleTop" android:name="pers.running203.androidlaunchmodetest.singletop.activity.Activity2"></activity> <activity android:launchMode="singleTop" android:name="pers.running203.androidlaunchmodetest.singletop.activity.Activity3"></activity> <activity android:launchMode="singleTop" android:name="pers.running203.androidlaunchmodetest.singletop.activity.Activity4"></activity>
启动顺序:
activity1->activity2->activity3->activity4->activity4
返回退出:
总结:activity的启动模式如果使用singleTop时,如果一个activity生成对象放于栈顶,这时如果要启动一个相同的activity对象,不会重新生成该activity对象,而是直接从栈顶去该activity对象出来使用,同样返回关闭时,需要将每个activity依次后退关闭,最终才能将程序关闭。
通过singleTask启动:
4个activity的定义:public class Activity1 extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Log.v("SingleTask", "activity1 oncreate");setContentView(R.layout.first);TextView textView=(TextView) findViewById(R.id.textView1);TextView textIdView=(TextView) findViewById(R.id.textIdView1);textView.setText(this.toString());textIdView.setText("current task id:"+this.getTaskId());Button bt=(Button) findViewById(R.id.button1);bt.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent=new Intent(Activity1.this,Activity2.class);startActivity(intent);}});}@Overrideprotected void onStart() {super.onStart();Log.v("SingleTask", "activity1 onStart");}@Overrideprotected void onPause() {super.onPause();Log.v("SingleTask", "activity1 onPause");}@Overrideprotected void onStop() {super.onStop();Log.v("SingleTask", "activity1 onStop");}@Overrideprotected void onDestroy() {super.onDestroy();Log.v("SingleTask", "activity1 onDestroy");}}
public class Activity2 extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.second);Log.v("SingleTask", "activity2 oncreate");TextView textView=(TextView) findViewById(R.id.textView2);TextView textIdView=(TextView) findViewById(R.id.textIdView2);textView.setText(this.toString());textIdView.setText("current task id:"+this.getTaskId());Button bt = (Button) findViewById(R.id.button2);bt.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(Activity2.this, Activity3.class);startActivity(intent);}});}@Overrideprotected void onStart() {super.onStart();Log.v("SingleTask", "activity2 onStart");}@Overrideprotected void onPause() {super.onPause();Log.v("SingleTask", "activity2 onPause");}@Overrideprotected void onStop() {super.onStop();Log.v("SingleTask", "activity2 onStop");}@Overrideprotected void onDestroy() {super.onDestroy();Log.v("SingleTask", "activity2 onDestroy");}}
public class Activity3 extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.third);Log.v("SingleTask", "activity3 oncreate");TextView textView=(TextView) findViewById(R.id.textView3);TextView textIdView=(TextView) findViewById(R.id.textIdView3);textView.setText(this.toString());textIdView.setText("current task id:"+this.getTaskId());Button bt = (Button) findViewById(R.id.button3);bt.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(Activity3.this, Activity4.class);startActivity(intent);}});}@Overrideprotected void onStart() {super.onStart();Log.v("SingleTask", "activity3 onStart");}@Overrideprotected void onPause() {super.onPause();Log.v("SingleTask", "activity3 onPause");}@Overrideprotected void onStop() {super.onStop();Log.v("SingleTask", "activity3 onStop");}@Overrideprotected void onDestroy() {super.onDestroy();Log.v("SingleTask", "activity3 onDestroy");}}
public class Activity4 extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.forth);Log.v("SingleTask", "activity4 oncreate");TextView textView = (TextView) findViewById(R.id.textView4);TextView textIdView = (TextView) findViewById(R.id.textIdView4);textView.setText(this.toString());textIdView.setText("current task id:"+this.getTaskId());Button bt = (Button) findViewById(R.id.button4);//bt.setText("forth go to forth");bt.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//Intent intent = new Intent(Activity4.this, Activity4.class);Intent intent = new Intent(Activity4.this, Activity2.class);startActivity(intent);}});}@Overrideprotected void onStart() {super.onStart();Log.v("SingleTask", "activity4 onStart");}@Overrideprotected void onPause() {super.onPause();Log.v("SingleTask", "activity4 onPause");}@Overrideprotected void onStop() {super.onStop();Log.v("SingleTask", "activity4 onStop");}@Overrideprotected void onDestroy() {super.onDestroy();Log.v("SingleTask", "activity4 onDestroy");}}AndroidManifest.xml的配置:
<!-- singleTask --> <activity android:launchMode="singleTask" android:name="pers.running203.androidlaunchmodetest.singletask.activity.Activity1"> <intent-filter > <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> <activity android:launchMode="singleTask" android:name="pers.running203.androidlaunchmodetest.singletask.activity.Activity2"></activity> <activity android:launchMode="singleTask" android:name="pers.running203.androidlaunchmodetest.singletask.activity.Activity3"></activity> <activity android:launchMode="singleTask" android:name="pers.running203.androidlaunchmodetest.singletask.activity.Activity4"></activity>
启动顺序:
activity1->activity2->activity3->activity4->activity1
返回退出:
启动顺序:
activity1->activity2->activity3->activity4->activity4->activity4->activity4
返回退出:
启动顺序:
activity1->activity2->activity3->activity4->activity2
总结:activity的启动模式如果使用singleTask时,启动activity时,生成activity对象,并依次入栈,当一个activity想跳转到另外一个activity时,不会马上生成对象,而是从栈里寻找是否已经存在该activity对象,如果存在,将栈顶activity对象依次出栈,并且销毁,直到得到该activity对象。返回退出时,依次将栈顶activity对象出栈销毁,最后退出程序。
通过singleTask启动:
4个activity的定义:public class Activity1 extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Log.v("SingleInstance", "activity1 oncreate");setContentView(R.layout.first);TextView textView=(TextView) findViewById(R.id.textView1);TextView textIdView=(TextView) findViewById(R.id.textIdView1);textView.setText(this.toString());textIdView.setText("current task id:"+this.getTaskId());Button bt=(Button) findViewById(R.id.button1);bt.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent=new Intent(Activity1.this,Activity2.class);startActivity(intent);}});}@Overrideprotected void onStart() {super.onStart();Log.v("SingleInstance", "activity1 onStart");}@Overrideprotected void onPause() {super.onPause();Log.v("SingleInstance", "activity1 onPause");}@Overrideprotected void onStop() {super.onStop();Log.v("SingleInstance", "activity1 onStop");}@Overrideprotected void onDestroy() {super.onDestroy();Log.v("SingleInstance", "activity1 onDestroy");}}
public class Activity2 extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.second);Log.v("SingleInstance", "activity2 oncreate");TextView textView=(TextView) findViewById(R.id.textView2);TextView textIdView=(TextView) findViewById(R.id.textIdView2);textView.setText(this.toString());textIdView.setText("current task id:"+this.getTaskId());Button bt = (Button) findViewById(R.id.button2);bt.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(Activity2.this, Activity3.class);startActivity(intent);}});}@Overrideprotected void onStart() {super.onStart();Log.v("SingleInstance", "activity2 onStart");}@Overrideprotected void onPause() {super.onPause();Log.v("SingleInstance", "activity2 onPause");}@Overrideprotected void onStop() {super.onStop();Log.v("SingleInstance", "activity2 onStop");}@Overrideprotected void onDestroy() {super.onDestroy();Log.v("SingleInstance", "activity2 onDestroy");}}
public class Activity3 extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.third);Log.v("SingleInstance", "activity3 oncreate");TextView textView=(TextView) findViewById(R.id.textView3);TextView textIdView=(TextView) findViewById(R.id.textIdView3);textView.setText(this.toString());textIdView.setText("current task id:"+this.getTaskId());Button bt = (Button) findViewById(R.id.button3);bt.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(Activity3.this, Activity4.class);startActivity(intent);}});}@Overrideprotected void onStart() {super.onStart();Log.v("SingleInstance", "activity3 onStart");}@Overrideprotected void onPause() {super.onPause();Log.v("SingleInstance", "activity3 onPause");}@Overrideprotected void onStop() {super.onStop();Log.v("SingleInstance", "activity3 onStop");}@Overrideprotected void onDestroy() {super.onDestroy();Log.v("SingleInstance", "activity3 onDestroy");}}
public class Activity4 extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.forth);Log.v("SingleInstance", "activity4 oncreate");TextView textView = (TextView) findViewById(R.id.textView4);TextView textIdView = (TextView) findViewById(R.id.textIdView4);textView.setText(this.toString());textIdView.setText("current task id:"+this.getTaskId());Button bt = (Button) findViewById(R.id.button4);//bt.setText("forth go to forth");bt.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//Intent intent = new Intent(Activity4.this, Activity4.class);Intent intent = new Intent(Activity4.this, Activity1.class);startActivity(intent);}});}@Overrideprotected void onStart() {super.onStart();Log.v("SingleInstance", "activity4 onStart");}@Overrideprotected void onPause() {super.onPause();Log.v("SingleInstance", "activity4 onPause");}@Overrideprotected void onStop() {super.onStop();Log.v("SingleInstance", "activity4 onStop");}@Overrideprotected void onDestroy() {super.onDestroy();Log.v("SingleInstance", "activity4 onDestroy");}}
AndroidManifest.xml的配置:
<!--singleInstance --> <activity android:launchMode="singleInstance" android:name="pers.running203.androidlaunchmodetest.singleinstance.activity.Activity1"> <intent-filter > <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> <activity android:launchMode="singleInstance" android:name="pers.running203.androidlaunchmodetest.singleinstance.activity.Activity2"></activity> <activity android:launchMode="singleInstance" android:name="pers.running203.androidlaunchmodetest.singleinstance.activity.Activity3"></activity> <activity android:launchMode="singleInstance" android:name="pers.running203.androidlaunchmodetest.singleinstance.activity.Activity4"></activity>
启动顺序:
activity1->activity2->activity3->activity4->activity1
返回退出:
总结:activity的启动模式如果使用singleInstance时,没启动一个activity,android系统会单独给每个activity对象一个栈结构,用于存放该activity对象。如果启动的activity已经有存在栈中,还是会生成activity对象,存入该栈。退出返回时,最先将当前栈里的activity对象出栈销毁,再依次后退销毁其他的栈里的activity对象。
至此全部总结完毕,如果我理解有错误,欢迎指正,在此先谢过,如果能帮到你,请给我点一下赞,谢谢。
- Android Activity的4种启动模式详解(代码+截图)
- Android activity的4种启动模式,launchMode,图文详解
- Android Activity 4种启动模式的详解
- 【Android】Activity的启动模式详解
- Android中Activity的启动模式详解
- Android中activity的启动模式详解
- Android ---Activity 的启动模式详解
- android activity的4种启动模式
- Android Activity的4种启动模式
- Android:Activity的4种启动模式
- android之activity的4中启动模式详解
- Android中Activity的四种启动模式详解
- Android中Activity的四种启动模式详解(转)
- Android中Activity的四种启动模式详解
- Android中Activity的四种启动模式详解
- android入门-Activity的四种启动模式详解
- Android Activity 启动模式详解
- Android:Activity启动模式详解
- sss
- Binary Search:367. Valid Perfect Square
- 拓扑排序+BFS+vector的使用
- DHCP 自动获取IP服务
- Rhyme/ Linux NTFS文件系统的支持
- Android Activity的4种启动模式详解(代码+截图)
- 普通网站的访问过程
- U3d经典必考面试题#持续更新##欢迎讨论交流#
- Java面试题集(51-70)
- impala 创建kudu表报错
- pythonAI五子棋(二)
- xinetd 托管服务:(超级守护进程服务)
- 八皇后问题——列出所有的解,可推至N皇后
- 【转】计算机视觉,计算机图形学和数字图像处理,三者之间的联系和区别