您的位置:首页 > 其它

Activity 启动模式个人见解

2016-06-16 17:59 316 查看
Android 开发中我们打交道最多的就是ActivityActivity 有四种启动模式,每一种启动模式都代表着特定的使用场合了解Activity 的启动模式,可以对我们使用Activity得心应手。

Activity Standard启动模式

standard是我们使用activity 的标准模式,大部分全部是默认standard模式,也称默认模式

代码如下,

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

tv = (TextView) findViewById(R.id.tv);
tv.setText("当前activity是:" + this.toString()+"\n"+"当前TaskID:"+getTaskId());

findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this,MainActivity.class));
}
});
}


两幅图让你清晰明了的懂



当前MainActivity实例是 3364163

当前MainActivity的TaskID是:13

我们再去启动一个当前Activity 后,



可以看到再次开启的MainActivity

实例是 436f4f9

TaskID 是 13

由此我们可以得出结论:

Standard模式下,所有的Activity全部是在一个堆栈中,每一个Activity都是一个单独的实例,当我们按返回键的时候,弹出栈顶的activity实例,然后在顶部activity下面的Activity显示出来,占据栈顶!

Activity SingleTask 启动模式

先看代码

MainActivity:

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

tv = (TextView) findViewById(R.id.tv);
tv.setText("当前activity是:" + this.toString()+"\n"+"当前TaskID:"+getTaskId());

findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this,MainActivity.class));
}
});

findViewById(R.id.btn2).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this,BActivity.class));
}
});
}


BActivity :

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.b);
tv = (TextView) findViewById(R.id.tv);
tv.setText("当前activity是:" + this.toString() + "\n" + "当前TaskID:" + getTaskId());

findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(BActivity.this, MainActivity.class));
}
});

findViewById(R.id.btn2).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(BActivity.this, BActivity.class));
}
});
}


步骤:

初始化MainActivity,先启动BActivity

在BActivity中启动MainActivity

此时,如果我们点击返回键,就会推出程勋,回到手机界面。

分析:

步骤1 的时候,在堆栈中产生了2个activity实例,MainActivity和BActivity ,接着去步骤2,这时候有了变化,因为堆栈中存在MainActivity实例,所以我们不会再去新创建一个新的MainActivity实例,而是把存在堆栈底部的MainActivity实例拿出来使用,那么问题来了,怎么拿出来??

很暴力的,MainActivity直接把在他上面的BActivity 弹出了堆栈,自己占据栈顶!此时,堆栈中只有MainActivity一个实例,所以按返回键,就自然退出程序了!



在配上这幅图,绝壁懂了!

Activity SingleTop 启动模式

步骤:

初始化MainActivity ,启动MainActivity 无任何变化,实例也未改变



初始化MainActivity ,启动BActivity,在启动MainActivity

此时MainActivity 的实例发生变化



得出结论:

SingleTop 模式下,启动的实例如果存在栈顶,ActivityManager并不会新建一个实例,而是选 择复 用原来的实例来保持singleTop中的唯一性,只会去调用onNewIntent方法如何实例不在栈顶,那么会再次创建一个实例,堆栈中会存在两个相同的实例。



此图绝壁懂!

Activity SingleInstance启动模式

这个模式,如图



这种启动模式比较特殊,因为它会启用一个新的栈结构,将Acitvity放置于这个新的栈结构中,并保证不再有其他Activity实例进入

使用代码实现

Intent i = new Intent(Intent.ACTION_MAIN);
i.setClassName(activityInfo.applicationInfo.packageName,activityInfo.name);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);


最后,说下在哪里配置启动模式



到此,Activity的四种启动模式就啰嗦完毕,理解四种模式,合理的使用,会使开发事半功倍。如果有帮到你,就多来逛逛。谢谢
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: