Task(任务) back Stack(回退栈)
- 栈:先进后出
- 任务:用于保存当前Activity组件的实例(动作)
- 回退栈:Activity在内存中的数据结构都是回退栈(管道)
备注:1.位于回退栈顶的窗口处于焦点状态(可见的)2.窗口的显示和退出其实就是入栈和出栈的过程
Activity启动模式
-1在清单文件中`标签内部,设置属性 Android:launceMode=“”
-支持四种属性:
standard 标准模式,默认的启动方式
singTop 栈顶单例模式
singleTask 栈中单例模式
singleInstance 全局单例模式
作用:内存的优化,用户的体验
- standard 标准模式,默认的启动模式(拿来主义)同一个Activity每次都会创建一个新的实例
- singleTop(拒绝堆叠)同一个Activity可以实例化多次,但是栈顶只能出现一个,当栈顶不存在要启动的Activity实例而是,系统会创建一个新的Activity实例,并且放到栈的顶端,当栈顶存在要启动的Activity实例时,系统会调用onNewIntent()方法,把Intent对象传递给已经存在的Activity实例,重用栈顶的Activity
- singleTask 浏览器 (独立门户) 同一个Activity实例在栈中只能有一个,当栈中不存在要启动的Activity实例时,系统会创建一个新的Activity实例,并且放入栈的顶端,当栈中已经存在要启动的Activity实例时,系统会调用已存在的Activity的onNewIntent(),把Intent对象传递给已经存在的Activity实例(并不会创建新的实例),并且不允许栈的上方出现其他的Activity实例,它上方的Activity实例将会被移出栈中,销毁
- singleInstance(孤独寂寞)当使用这种模式启动Activity时,系统会分配一个单独的任务,并将Activity的实例放入栈的底端,它不允许其他的Activity实例和他共享一个栈
第二种方式:在代码中设置,Activity类中设置,通过Intent对象设置
- intent.setFlages(…..);
- intent.FLAG_ACTIVITY_SINGLE_TOP 等同于属于属性中的singleTop
- intent.FLAG_ACTIVITY_CLEAR_TOP 同singleTask相似,当栈中不存在时创建;如果存在那么会把它以及之上的所有实例移除,并且销毁,创建一个新的实例放入栈的顶端
- Intent.FLAG_ACTIVITY_NEW_TASK必须在清单文件的
<activity/>
标签中增加属性android:taskAffinity="com.other" android:alwaysRetainTaskState="true"
只是增加了这两个属性,系统才会为当前的实例创建新的任务,并且放到栈的底部,否则等同于没有设置。
测试代码
public class MainActivity extends Activity {
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.tv);
tv.setText(getTaskId()+"-----"+this.hashCode());
}
public void clickButton(View v)
{
Intent intent = new Intent(this, BActivity.class);
//通过代码方式设置启动方式
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);
}
}
public class BActivity extends Activity {
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_b);
tv = (TextView) findViewById(R.id.tv);
tv.setText(getTaskId()+"-----"+this.hashCode());
}
public void clickButton(View v)
{
Intent intent = new Intent(this, CActivity.class);
//通过代码方式设置启动方式
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
}
public class CActivity extends Activity {
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_c);
tv = (TextView) findViewById(R.id.tv);
tv.setText(getTaskId()+"-----"+this.hashCode());
}
public void clickButton(View v)
{
Intent intent = null;
switch (v.getId()) {
case R.id.but01:
intent = new Intent(this,BActivity.class);
//通过代码方式设置启动方式
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
break;
case R.id.but02:
intent = new Intent(this,CActivity.class);
//通过代码方式设置启动方式
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
break;
}
startActivity(intent);
}
@Override
protected void onNewIntent(Intent intent) {
// TODO Auto-generated method stub
super.onNewIntent(intent);
tv.setText("onNewIntent" + getTaskId()+"-----"+this.hashCode());
}