Activity的四种加载模式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Activity的四种加载模式相关的知识,希望对你有一定的参考价值。

启动模式简介:
    *standard:标准模式,也是默认的加载模式。
    *singleTop:Task栈顶单例模式。
    *singleTask:Task内单例模式。
    *singleInstance:全局单例模式。
一、standard模式启动:
        通过standard模式启动时,系统总会为目标Activity创建一个新的实例,并将该Activity添加到当前Task栈中——这种启动模式不会启动新的Task,新Activity将被添加到原来的Task栈中。
    示例:
创建一个Activity,用standard模式重复加载该Activity,可以看到,Task的Id是不变的——表明这种加载模式不会使用新的Task,而是使用同一个Task栈。当我们按返回键时,系统将会“逐一”从Activity栈顶删除Activity。
public class StandardStartActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout ll=new LinearLayout(StandardStartActivity.this);
ll.setOrientation(LinearLayout.VERTICAL);
this.setContentView(ll);
//这个TextView 用于显示Activity和Task ID
TextView textView=new TextView(StandardStartActivity.this);
textView.setText("Activity是:"+this.toString()+"\n"+",task Id是:"+this.getTaskId());
//设置一个按钮启动MainActivity
Button button=new Button(StandardStartActivity.this);
button.setText("启动MainActivity");
//添加TextView和Button
ll.addView(textView);
ll.addView(button);
//为按钮设置监听
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent=new Intent(StandardStartActivity.this,StandardStartActivity.class);
startActivity(intent);
}
});
}
}
二、singleTop模式启动:
    这种模式与standard模式相似,但有一点不同:当将要启动的目标Activity已经位于Task栈顶时,系统不会重新创建目标Activity的实例,而是直接复用已有的Activity实例。如果将要启动的目标Activity没有位于栈顶,此时系统就会重新创建目标Activity的实例。

三、singleTask()模式:


    这种加载模式的Activity在同一个Task内只有一个实例,采用这种模式启动目标Activity时,可分为如下三种情况:
  *如果将要启动的目标Activity不存在你,系统将会创建目标Activity的实例,并将它加入Task栈顶。
  *如果将要启动的目标Activity已经位于栈顶,此时与singleTop模式的行为相同。
*如果将要启动的目标Activity已经存在,但是没有位于Task栈顶,系统将会把位于该Activity上面的所有Activity移除Task栈,从而使得目标Activity转入栈顶。
示例:
创建一个Activity,此Activity设为应用入口Activity,以默认模式启动。并在此Activity中设置一个按钮,用于跳转到另外一个以singleTask模式启动的Activity
public class SingleTaskModleActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout linearLayout=new LinearLayout(SingleTaskModleActivity.this);
linearLayout.setOrientation(LinearLayout.VERTICAL);
this.setContentView(linearLayout);
TextView textView=new TextView(SingleTaskModleActivity.this);
textView.setText("Activity是:"+this.toString()+"\n"+",task Id是:"+this.getTaskId());
Button button=new Button(SingleTaskModleActivity.this);
button.setText("启动Onother_Activity");
linearLayout.addView(textView);
linearLayout.addView(button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent=new Intent(SingleTaskModleActivity.this,OnotherActivity.class);
startActivity(intent);
}
});
}
}
创建另一个Activity,并以singleTask模式启动,(即在androidManiFest.xml中配置<activity
android:launchMode="singleTask"
>这个属性)在此Activity中也设置一个按钮,用于控制跳转到SingleTaskModleActivity
public class OnotherActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout linearLayout=new LinearLayout(OnotherActivity.this);
linearLayout.setOrientation(LinearLayout.VERTICAL);
this.setContentView(linearLayout);
TextView textView=new TextView(OnotherActivity.this);
textView.setText("Activity是:"+this.toString()+"\n"+",task Id是:"+this.getTaskId());
Button button=new Button(OnotherActivity.this);
button.setText("启动SingleTaskModle_Activity");
linearLayout.addView(textView);
linearLayout.addView(button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent=new Intent(OnotherActivity.this,SingleTaskModle.class);
startActivity(intent);
}
});
}
}
      (1)  当我们运行程序,进入SingleTaskModleActivity第一次点击按钮“启动Onother_Activity”,此时会跳转到OnotherActivity,
OnotherActivity会以singleTask模式启动:OnotherActivity不存在,所以系统将会创建新的Activity实例。现在存在的Activity由下到上有:
SingleTaskModleActivity→OnotherActivity
(2) 通过上面步骤,我们所处Activity为OnotherActivity,此时点击按钮“启动SingleTaskModle_Activity”跳转到SingleTaskModleActivity,由于SingleTaskModleActivity是以默认模式(standard)启动,所以会创建一个新的Activity实例:此时Activity由下到上有:
SingleTaskModleActivity...1→OnotherActivity→SingleTaskModleActivity...2
(3)通过以上步骤,处于SingleTaskModleActivity,此时再次点击按钮“启动Onother_Activity”跳转到OnotherActivity,并以singleTask
模式启动,此时已经有一个OnotherActivity存在于第二层没有位于栈顶,所以当启动它时会把第二层上面的所有Activity(现在只有SingleTaskModleActivity...2)移除Task栈,让OnotherActivity转入栈顶。此时存在的Activity由下到上有:
SingleTaskModleActivity→OnotherActivity
四、singleInstance(单一实例)加载模式:
    在这种加载模式下,系统保证无论从哪个task中启动目标Activity,只会创建一个目标Activity实例,并会使用一个全新的Task栈来加载该Activity实例。
    *如果将要启动的目标Activity不存在,系统就会先创建一个全新的Task,再创建目标Activity的实例,并将其加入新的Task栈顶。
    *如果将要启动的目标Acticity已经存在,无论它位于哪个应用程序中,位于哪个Task栈中,系统都会把该Activity所在的Task转到前台,从而使该Activity显示出来。
五、一些应用场景:
    singleTop:适合接收通知启动的内容显示页面。例如,某个新闻客户端的新闻内容页面,如果收到10个新闻推送,每次都打开一个新闻内容页面是很烦人的。
从外界可能多次跳转到一个界面
singleTask:适合作为程序入口点。例如浏览器的主界面。不管从多少个应用启动浏览器,只会启动主界面一次,其余情况都会走onNewIntent,并且会清空主界面上面的其他页面。
singleInstance:适合需要与程序分离开的页面。例如闹铃提醒,将闹铃提醒与闹铃设置分离。singleInstance不要用于中间页面,如果用于中间页面,跳转会有问题,比如:A -> B (singleInstance) -> C,完全退出后,在此启动,首先打开的是B。(某个应用中用到了google地图,当退出该应用的时候,进入google地图,还是刚才的界面)





以上是关于Activity的四种加载模式的主要内容,如果未能解决你的问题,请参考以下文章

Activity的四种加载模式

Activity的四种加载模式详解:

详解Android开发中Activity的四种launchMode

知识总结: Activity的四种启动模式

安卓中Activity的四种启动模式

Activity的四种启动模式