activity启动模式应用,如FLAG_ACTIVITY_CLEAR_TOP

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代码如下:

[java]  view plain copy
  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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值