Android的四种加载模式:

首先在配置Activity时即可指定该Activity用哪种加载模式,通过android:launchMode属性。

四种加载模式:

standard:标准模式,默认

singleTop:Task顶单例模式

singleTask:Task内单例模式

singleInstance:全局单例模式

Android是通过Task对Activity进行管理的,通过getTaskID()方法可以获得当前活动的Task的ID。

可以把Task理解成Activity栈,Task以栈的形式来管理Activity。

下面是四种模式:

1.standard模式

每次通过这种模式来启动目标Activity时,Android会为目标Activity创建一个新的实例,并将干Activity添加到当前Task栈中----这种模式不会启动新的Task,新Activity将被添加到原有的Task中。


import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.LinearLayout;import android.widget.TextView;public class MainActivity extends Activity implements OnClickListener {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);LinearLayout layout = new LinearLayout(MainActivity.this);layout.setOrientation(1);setContentView(layout);TextView textView = new TextView(MainActivity.this);textView.setText("ACtivity为  :" + this.toString() + "\n" + ",Task Id为:"+ this.getTaskId());Button button = new Button(this);button.setText("启动Main");layout.addView(textView);layout.addView(button);button.setOnClickListener(this);}@Overridepublic void onClick(View v) {// TODO Auto-generated method stubIntent intent = new Intent(MainActivity.this, MainActivity.class);startActivity(intent);}}





多次点击按钮,程序会不断的启动当前活动,活动的hashCode变化,但是TaskId总是一样的,这就表明这种加载模式不会启动新的Task。

当按返回键的时候,启动的活动会逐一从栈顶删除。




2.singleTop

这种模式与标准模式基本相似,但是有一点不同:当将要被启动的目标Activity已经位于栈顶时,系统不会重新创建目标Activity实例,而是直接复用已有的Activity实例。

将上例中的launchmode改为singleTop,无论用户点击多少次按钮,界面上的程序不会有任何变化。

如果说要被启动的目标Activity没有位于Task栈顶,此时系统会重新创建目标Activity实例,并将它加载到Task的栈顶----此时与标准模式完全相同。



3.singleTask


采用这种加载模式的Activity在同一个Task内只有一个实例,启用目标Activity时,有下面三种情况:

1.如果将要启动的活动不存在,则创建,放入栈顶

2.如果目标Activity已经存在于栈顶,则与singleTop一样

3.如果目标Activity已存在,但是不是位于栈顶,系统会将目标活动前的活动移出Task栈,使得目标Activity位于栈顶

演示说明第三种情况:

程序中有两个活动,活动中都有一个TextView和一个Button,TextView用来显示活动的hashCode以及TaskID,Button用来启动不同的活动。

当按下第一个活动中的按钮时会启动第二个活动,当按下第二个活动中的按钮的时候会启动第一个活动。








1表示活动1以及它的加载模式

2表示活动2以及它的加载模式

这就是运行截图与示意图。

首先先创建并启动的是1,再创建启动2,再创建启动1,再启动2,已经有2了,不会创建,所以便把2之前的1移出栈,使得2位于栈顶。

如果在接着启动1的话,这个1会再进行创建,已经不是原来的活动1了。

应该可以充分的说明上述第三种情况。



4.singleInstance



再这种加载模式下,系统保证无论从哪个Task中启动目标活动,只会创建一个目标活动实例,并会使用一个全新的Task栈来装载该活动实例

当系统采用该模式启动目标活动的时候,有以下两种情况:

1.如果将要启动的活动不存在,则先创建一个Task,再创建目标活动,加入栈顶

2.如果目标活动已经存在,无论它在哪个应用程序中,无论在哪个Task中,系统会把还Activity所在的Task栈转到前台,从而使用该Activity显示出来

采用singleInstance加载模式加载Activity总是位于Task栈顶,因为Task栈中只有一个Activity。

将上例中的两个活动的加载模式都改为singleInstance。





更多相关文章

  1. Android启动过程深入解析
  2. android之Progress
  3. Android(安卓)虚拟摇杆,多种模式回调,返回距离级别,方向,角度。
  4. Android(安卓)Intent个人介绍
  5. Android开发从入门到精通
  6. Android(安卓)SplashActivity启动时黑屏的问题
  7. Android四种Activity的加载模式
  8. Android工具之Hierarchy Viewer--分析应用程序UI布局
  9. Android系统启动

随机推荐

  1. Linux系统编程——进程间通信:信号中断处
  2. Linux下安装mysql 出现依赖包冲突解决方
  3. ubi文件系统制作,还是"-c"选项的问题
  4. 求GridControl_11.1.0.1.0_Linux_x86-64_
  5. Linux 系统下 DNS 服务器的架设
  6. Linux CentOS6环境下MySQL5.1升级至MySQL
  7. Linux 开/关 ICMP 回应(防止被ping)
  8. 《Unix & Linux 大学教程》 - 第十九章(一
  9. linux vim下如何让类似txt的文本,呈现出某
  10. 我从网上下载了RedHat Linux 9.03,是三个