博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Activity的4种启动模式
阅读量:6866 次
发布时间:2019-06-26

本文共 9057 字,大约阅读时间需要 30 分钟。

hot3.png

Activity共有四种启动模式,standard/singleTop/singleTask/singleInstance

在AndroidManifest.xml中在<activity>标签中launchMode指定

 

 

1、standard模式

standard是Activity的默认启动模式。 Android是通过返回栈(返回栈详见)来管理Activity,在standard模式下,每当启动一个新的activity,系统不管这个activity是否存在返回栈中,每次启动都会有一个该activity的新的实例。

package sunny.example.standardactivity;import android.support.v7.app.ActionBarActivity;import android.widget.Button;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.widget.TextView;import android.view.View.OnClickListener;import android.content.Intent;public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);    TextView standard = (TextView)findViewById(R.id.standard);  String string = "MainActivity" ;  Log.d("MainActivity",this.toString());  standard.setText(string);  Button standardB = (Button)findViewById(R.id.standardB);  standardB.setOnClickListener(new OnClickListener(){   @Override   public void onClick(View v) {    // TODO Auto-generated method stub    Intent intent = new Intent(MainActivity.this,MainActivity.class);    startActivity(intent);   }     });   } } //图见《Android第一行代码》P69//AndroidManifest.xml 
                
                
                    

2、singleTop

与1不同,此模式下,在启动Activity的时候如果发现返回栈的栈顶已经是该Activity,则认为可以直接使用,不用再创建Activity实例。若仅将1的MainActivity的launchMode改为singleTop,则只会产生一个实例,不论按多少次Button。此时仅按一次Back键就可以退出程序。但若MainActivity未处于栈顶,再次启动时还是会创建新的实例,以下即为第二种情况,当点击Button进入SecondActivity,再点击Button进入MainActivity,此时会在创建一个MainActivity实例,因为在由SecondActivity跳到MainActivity时,此时的栈顶是SecondActivity。

//MainActivity.java package sunny.example.singletopactivity;import android.support.v7.app.ActionBarActivity;import android.widget.Button;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.widget.TextView;import android.view.View.OnClickListener;import android.content.Intent;public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);    TextView standard = (TextView)findViewById(R.id.standard);  String string = "MainActivity";  standard.setText(string);  Button standardB = (Button)findViewById(R.id.standardB);  standardB.setOnClickListener(new OnClickListener(){   @Override   public void onClick(View v) {    // TODO Auto-generated method stub    Intent intent = new Intent(MainActivity.this,SecondActivity.class);    startActivity(intent);   }     });       } }//SecondActivity.javapackage sunny.example.singletopactivity;import android.support.v7.app.ActionBarActivity;import android.os.Bundle;import android.widget.Button;import android.view.View;import android.view.View.OnClickListener;import android.content.Intent;import android.widget.TextView;public class SecondActivity extends ActionBarActivity{  @Override protected void onCreate(Bundle savedInstanceState){  super.onCreate(savedInstanceState);  setContentView(R.layout.second);    TextView secondTextView = (TextView)findViewById(R.id.secondTextView);  String sencondTextView = "SecondActivity";  secondTextView.setText(sencondTextView);    Button toMainActivity = (Button)findViewById(R.id.toMainActivity);  toMainActivity.setOnClickListener(new OnClickListener(){   @Override   public void onClick(View v) {    // TODO Auto-generated method stub    Intent intent = new Intent(SecondActivity.this,MainActivity.class);    startActivity(intent);   }     }); }}

3、singleTask

与2不同,此模式下,每次启动Activity,系统首先在返回栈中检查是否存在该Activity的实例,如果存在则直接使用该实例,并把在这个Activity之上的所有Activity统统出栈,否则才创建新的实例。

//MainActivity.javapackage sunny.example.activitysingletask;import android.support.v7.app.ActionBarActivity;import android.widget.TextView;import android.widget.Button;import android.view.View.OnClickListener;import android.content.Intent;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.view.View;public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);    TextView singleTask = (TextView)findViewById(R.id.singleTask);  String text = "MainActivity";  singleTask.setText(text);    Button toSecond = (Button)findViewById(R.id.toSecondActivity);  toSecond.setOnClickListener(new OnClickListener(){   @Override   public void onClick(View v){    Intent intent = new Intent(MainActivity.this,SecondActivity.class);    startActivity(intent);   }  }); } @Override public void onRestart(){  super.onRestart();  TextView restart = (TextView)findViewById(R.id.restart);  String text = "SecondActivityRestart";  restart.setText(text); } } //SecondActivity.javapackage sunny.example.activitysingletask;import android.support.v7.app.ActionBarActivity;import android.os.Bundle;import android.content.Intent;import android.view.View;import android.view.View.OnClickListener;import android.widget.TextView;import android.widget.Button;public class SecondActivity extends ActionBarActivity{@Override public void onCreate(Bundle savedInstanceState){  super.onCreate(savedInstanceState);  setContentView(R.layout.second);    TextView singleTaskT = (TextView)findViewById(R.id.singleTaskT);  String text = "SecondActivity";  singleTaskT.setText(text);    Button toMainActivity = (Button)findViewById(R.id.toMainActivity);  toMainActivity.setOnClickListener(new OnClickListener(){   @Override   public void onClick(View v){    Intent intent = new Intent(SecondActivity.this,MainActivity.class);    startActivity(intent);   }  });     }  @Override public void onDestroy(){  super.onDestroy();  TextView destroy = (TextView)findViewById(R.id.destroy);  String text = "SecondActivityDestroy";  destroy.setText(text); } }

175644_s9pc_2653987.jpg

如上图,当从SecondActivity返回时MainActivity执行了Restart,说明没有创建新的实例。

 

4、singleInstance

不同于以上三种,Activity指定为该模式时系统会启用一个新的栈来管理这个Activity。应用场景:Activity1与Activity3共享Activity2的实例,此时可以指定Activity2为singleInstance模式。解决了共享实例的问题。

//MainActivity.java package sunny.example.activitysingleinstance;import android.support.v7.app.ActionBarActivity;import android.widget.TextView;import android.widget.Button;import android.view.View.OnClickListener;import android.content.Intent;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.view.View;public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);    TextView singleTask = (TextView)findViewById(R.id.singleInstance);  String text = "MainActivity"+getTaskId();  singleTask.setText(text);    Button toSecond = (Button)findViewById(R.id.toSecondActivity);  toSecond.setOnClickListener(new OnClickListener(){   @Override   public void onClick(View v){    Intent intent = new Intent(MainActivity.this,SecondActivity.class);    startActivity(intent);   }  }); } @Override public void onRestart(){  super.onRestart();  TextView restart = (TextView)findViewById(R.id.restart);  String text = "SecondActivityRestart";  restart.setText(text); } }//SecondActivity.javapackage sunny.example.activitysingleinstance;import android.support.v7.app.ActionBarActivity;import android.os.Bundle;import android.widget.Button;import android.view.View;import android.view.View.OnClickListener;import android.content.Intent;import android.widget.TextView;public class SecondActivity extends ActionBarActivity{  @Override protected void onCreate(Bundle savedInstanceState){  super.onCreate(savedInstanceState);  setContentView(R.layout.second);    TextView secondTextView = (TextView)findViewById(R.id.secondTextView);  String sencondTextView = "SecondActivity" + getTaskId();  secondTextView.setText(sencondTextView);    Button toMainActivity = (Button)findViewById(R.id.toMainActivity);  toMainActivity.setOnClickListener(new OnClickListener(){   @Override   public void onClick(View v) {    // TODO Auto-generated method stub    Intent intent = new Intent(SecondActivity.this,ThirdActivity.class);    startActivity(intent);   }     }); }}//ThirdActivity.javapackage sunny.example.activitysingleinstance;import android.support.v7.app.ActionBarActivity;import android.os.Bundle;import android.widget.TextView;public class ThirdActivity extends ActionBarActivity{ @Override protected void onCreate(Bundle savedInstanceState){  super.onCreate(savedInstanceState);  setContentView(R.layout.third);    TextView third = (TextView)findViewById(R.id.third);  String text = "ThirdActivity"+getTaskId();  third.setText(text); }}//ActivityManifest.xml

 

202933_mbzx_2653987.jpg

202933_wYrU_2653987.jpg

202933_KU5z_2653987.jpg

由图可见,SecondActivity的TaskId与MainActivity、ThirdActivity不同,SecondActivity存放在一个单独的返回栈里。MainActivity与ThirdActivity在同一个栈里,此时由ThirdActivity按返回键会返回到MainActivity,再按返回键到栈顶SecondActivity,即ThirdActivity-->MainActivity-->SecondActivity--退出程序。

转载于:https://my.oschina.net/doudoulee/blog/631761

你可能感兴趣的文章
Java关键字final、static使用总结<转>
查看>>
Excel VBA 宏,使用某模版新建文档时,某些cell自动填充
查看>>
Python天天美味(17) - open读写文件
查看>>
Web应用安全之Response Header里的敏感信息
查看>>
[51单片机] 四相五线减速比为1/64步进电机驱动设计
查看>>
使用HttpHanlder处理404: File not found
查看>>
矩形旋转一定角度后,四个点的新坐标
查看>>
NODE-WEBKIT教程(5)NATIVE UI API 之FRAMELESS WINDOW
查看>>
[CareerCup] 15.6 Entity Relationship Diagram 实体关系图
查看>>
Node.js与Sails~项目结构与Mvc实现
查看>>
Eclipse 分栏同时显示多个文件的内容
查看>>
bccomp比较大小注意
查看>>
js 中 typeof 的使用
查看>>
15个很好的自定义jQuery提示信息框插件( 转)
查看>>
Ansible :一个配置管理和IT自动化工具
查看>>
在Action中以Struts2的方式输出JSON数据
查看>>
【小贴士】探一探javascript中的replace
查看>>
jBPM开发入门指南(2)
查看>>
java基础面试题
查看>>
[LeetCode] UTF-8 Validation 编码验证
查看>>