本节学习Activity的加载模式。可能就会问,什么是加载模式? 加载方式有什么用途? 这是因为Android系统对Activity是采用Task栈来管理的。Task栈是采用先进后出的方式,先启动的Activity放在栈底,后启动的Activity是放在栈顶。
Activity共有四种加载方式:
1:standard:标准模式,同时也是默认的加载方式
2:singleTop:Task栈顶单例模式
3:singleTask:Task栈内单例模式
4:singleInstance:全局单例模式
下面举例说明四种加载模式。
1. stardard加载模式
Activity逻辑代码:
代码语言:javascript复制public class FirstActivity extends Activity {
private TextView textView;
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_first);
textView = (TextView)findViewById(R.id.textView1);
button = (Button)findViewById(R.id.button1);
String string = "Activity_id: " this.toString() "n" "task_id: " this.getTaskId();
textView.setText(string);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
//自己启动自己
Intent intent = new Intent(FirstActivity.this, FirstActivity.class);
startActivity(intent);
}
});
}
}
布局文件就一个TextView和一个Button,大家自行编写
记得全局配置文件中Activity的加载模式,必须配置为Standard
以下是运行效果:
可以明显的看出,当我按三次加上刚进来的第一次,共四次。 可以明显的看出,四次的Activity的id是不一样的,TaskId是一样的。
这说明了,当加载方式是Standard的时候,当我们向实例话Activity时,总是为我们重新创建一个Activity,但这些Activity都是位于同一个Task中的。当然了,如果向全部推出,就需要按四次Back键才会完全退出。
上图就是FirstActivity的栈示意图
2:singleTop模式
这种模式分两种情况:
a: 当此Activity位于栈顶
上面的FirstActivity代码不变(为了让大家看到我确实按下了,当我按下时我会设置button的值),此时配置文件中的加载模式改为singleTop
演示效果如下:
通过上图可以看到,当加载模式是singleTop的话,并且次Activity位于栈顶,每次实例化FirstActivity,却只是实例化一次。
b:当出现如下图这种情况时
我们新建一个SecondActivity,此Activity的加载模式是Stardard
代码语言:javascript复制public class SecondActivity extends Activity {
private TextView textView;
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
textView = (TextView)findViewById(R.id.textView1);
button = (Button)findViewById(R.id.button1);
String string = "Activity_id: " this.toString() "n" "task_id: " this.getTaskId();
textView.setText(string);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Intent intent = new Intent(SecondActivity.this, FirstActivity.class);
startActivity(intent);
}
});
}
}
此时FirstActivity中的Intent就不是启动自己了,是启动SecondActivity。
代码语言:javascript复制 button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivity(intent);
count;
button.setText("button: " count);
}
});
运行效果如下:
此时栈里的情况为:
可以说明,SingleTop加载模式是: 如果此Activity是位于栈顶的,再次加载就不用实例话。如果不位于栈顶,那么加载时还必须实例化。
3:singTask加载模式:
此种加载模式分为3中:
a: 如果要启动的Activity不存在,那就实例化并加入栈顶
b:如果要启动的Activity存在,并且位于栈顶,那就不需要实例化(这种情况就是SingleTop加载模式)
c:如果要启动的Activity存在,但是不位于栈顶,那就需要将目标Activity上面的Activity全部出栈。
我们就分析c这种情况:
代码不用改变,只需要将FirstActivity配置为SingleTask模式
运行效果如下:
4:singleInstance加载模式:
代码不用改动,只需将配置文件中FirstActivity改为singleInstace加载模式
运行效果如下:
可以看的,FirstActivity与SecondActivity是不位于同一个栈,可以明显看到Taskid=12的栈中就唯一存在一个FirstActivity
可以看出singleInstace加载模式,系统保证无论从那个Task中启动目标Activity,知会创建一个目标Activity实例,并使用一个全新的Task类管理该Activity实例。
好。 今天Activity的启动模式就说到这里