activity启动模式应用,如FLAG_ACTIVITY_CLEAR_TOP

来源:互联网 发布:web前端性能优化方案 编辑:程序博客网 时间:2024/06/16 20:23

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() {@Overridepublic void run() {// TODO Auto-generated method stubToast.makeText(MainActivity.this, "MainActivity", Toast.LENGTH_LONG).show();new Handler().postDelayed(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubIntent 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");}@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.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代码如下:

[java] view plaincopy
  1. package com.scott.launchmode;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.Intent;  
  5. import android.os.Bundle;  
  6. import android.view.View;  
  7. import android.widget.Button;  
  8. import android.widget.TextView;  
  9.   
  10. public class FirstActivity extends Activity {  
  11.     @Override  
  12.     public void onCreate(Bundle savedInstanceState) {  
  13.         super.onCreate(savedInstanceState);  
  14.         setContentView(R.layout.first);  
  15.         TextView textView = (TextView) findViewById(R.id.textView);  
  16.         textView.setText(this.toString());  
  17.         Button button = (Button) findViewById(R.id.button);  
  18.         button.setOnClickListener(new View.OnClickListener() {  
  19.             @Override  
  20.             public void onClick(View v) {  
  21.                 Intent intent = new Intent(FirstActivity.this, FirstActivity.class);  
  22.                 startActivity(intent);  
  23.             }  
  24.         });  
  25.     }  
  26. }  
我们FirstActivity界面中的TextView用于显示当前Activity实例的序列号,Button用于跳转到下一个FirstActivity界面。

然后我们连续点击几次按钮,将会出现下面的现象:

我们注意到都是FirstActivity的实例,但序列号不同,并且我们需要连续按后退键两次,才能回到第一个FristActivity。standard模式的原理如下图所示:


如图所示,每次跳转系统都会在task中生成一个新的FirstActivity实例,并且放于栈结构的顶部,当我们按下后退键时,才能看到原来的FirstActivity实例。

这就是standard启动模式,不管有没有已存在的实例,都生成新的实例。


其他模式都会调用onnewintent方法
0 0