Android 四大组件学习之Activity七

2022-05-08 16:03:26 浏览数 (1)

本节学习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的启动模式就说到这里

0 人点赞