FLAG_ACTIVITY_CLEAR_TOP :如果设置,并且要启动的activity已经在当前的任务中,那么在该activity之上的activity都会关闭,并且intent会传递给老的activity(现在在栈顶)
例如,假设一个任务包含四个activity:A,B,C,D,假设D中启动B并且带有次标志,则 C和D都会结束,并且B会收到intet,现在的栈变成了A,B
在上面的例子中,当前运行的B要么在他的onNewIntent方法中接受这个Intent,或者结束掉已经存在的实例并且重启一个,这依赖与B的启动模式,如果是确实的"multiple(即standard)",那么结束掉实例并重启一个,其他启动模式下将会调用他的onNewIntent
如下代码:
MainActivity:
<pre name="code" class="java">package com.example.activitymode;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "MainActivity", Toast.LENGTH_LONG).show();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
Intent mainIntent = new Intent(
MainActivity.this,SecondActivity.class);
MainActivity.this.startActivity(mainIntent);//个人理解:这句话是为了使<pre name="code" class="java" style="font-size: 13px; line-height: 24.0499992370605px;">SecondActivity在栈顶,以便使用launch触发<span style="line-height: 24.0499992370605px; font-family: 'Microsoft YaHei', 微软雅黑, Arial, 'Lucida Grande', Tahoma, sans-serif;">FLAG_ACTIVITY_CLEAR_TOP参数。如果没有这句话,直接触发。在栈顶是只有mainActivity,而没有secondActivity,是没有效果的。原因看上文解释</span>
SecondActivity.launch(MainActivity.this);//这句触发
FLAG_ACTIVITY_CLEAR_TOP,使用栈顶的secondactivity。
MainActivity.this.finish();}}, 2000);}}, 2000); }}
SecondActivity:
<pre name="code" class="java">package com.example.activitymode;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
public class SecondActivity extends Activity {
public static void launch(Context c)
{
Intent intent = new Intent(c,SecondActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
c.startActivity(intent);
Log.d("launch", "launch");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toast.makeText(SecondActivity.this, "SecondActivity.onCreate", Toast.LENGTH_LONG).show();;
}
}
不过以上实验是在activity的启动模式属于
standard
1.standard
standard模式是默认的启动模式,不用为<activity>配置android:launchMode属性即可,当然也可以指定值为standard。
我们将会一个Activity,命名为FirstActivity,来演示一下标准的启动模式。FirstActivity代码如下:
- package com.scott.launchmode;
- import android.app.Activity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.view.View;
- import android.widget.Button;
- import android.widget.TextView;
- public class FirstActivity extends Activity {
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.first);
- TextView textView = (TextView) findViewById(R.id.textView);
- textView.setText(this.toString());
- Button button = (Button) findViewById(R.id.button);
- button.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- Intent intent = new Intent(FirstActivity.this, FirstActivity.class);
- startActivity(intent);
- }
- });
- }
- }
然后我们连续点击几次按钮,将会出现下面的现象:
我们注意到都是FirstActivity的实例,但序列号不同,并且我们需要连续按后退键两次,才能回到第一个FristActivity。standard模式的原理如下图所示:
如图所示,每次跳转系统都会在task中生成一个新的FirstActivity实例,并且放于栈结构的顶部,当我们按下后退键时,才能看到原来的FirstActivity实例。
这就是standard启动模式,不管有没有已存在的实例,都生成新的实例。
其他模式都会调用onnewintent方法