activity启动FLAG之FLAG_ACTIVITY_CLEAR_TASK

随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666)

官方文档解释:

If set in an Intent passed to Context.startActivity(), this flag will cause any existing task that would be associated with the activity to be cleared before the activity is started. That is, the activity becomes the new root of an otherwise empty task, and any old activities are finished. This can only be used in conjunction with FLAG_ACTIVITY_NEW_TASK.

翻译:如果在通过Context.startActivity()启动activity时为Intent设置了此标识,这个标识将导致:在此activity启动之前,任何与此activity相关联的task都会被清除。也就是说,此

activity将变成一个空栈中新的最底端的activity,所有的旧activity都会被finish掉,这个标识仅仅和FLAG_ACTIVITY_NEW_TASK联合起来才能使用。

下面给一个例子,看看设置了此标识和不设置有什么区别:

MainActivity:

package com.hom.testflag;

import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.app.Activity;
import android.content.Intent;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		LinearLayout layout = new LinearLayout(this);
		Button btn = new Button(this);
		btn.setText("跳转到A");
		layout.addView(btn);
		setContentView(layout);
		btn.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				Intent intent = new Intent(MainActivity.this, ActivityA.class);
				startActivity(intent);
			}
		});
	}

}

ActivityA:

package com.hom.testflag;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;

public class ActivityA extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		LinearLayout layout = new LinearLayout(this);
		Button btn = new Button(this);
		btn.setText("跳转到B");
		layout.addView(btn);
		setContentView(layout);

		btn.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				Intent intent = new Intent(ActivityA.this, ActivityB.class);
				intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
				startActivity(intent);
			}
		});
	}
}

ActivityB:

package com.hom.testflag;

import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.LinearLayout;

public class ActivityB extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		LinearLayout layout = new LinearLayout(this);
		Button btn = new Button(this);
		btn.setText("ActivityB");
		layout.addView(btn);
		setContentView(layout);
	}
}





 

`FLAG_ACTIVITY_CLEAR_TASK` 是 Android 中的一个 **Intent Flag**,用于在启动Activity 时 **清空当前任务栈**,并让新 Activity 成为该任务栈的 **唯一根 Activity**。 --- ### **核心行为** 1. **清空任务栈** - 无论当前任务栈中有多少个 Activity,都会被全部销毁(调用 `onDestroy()`)。 - **示例**:假设任务栈是 `A → B → C`,使用 `FLAG_ACTIVITY_CLEAR_TASK` 启动 `D`,结果栈变为 `D`(`A、B、C` 被移除)。 2. **新 Activity 成为唯一根** - 新启动Activity 会成为任务栈的唯一 Activity(类似 `singleTask` + 清空栈)。 3. **通常与 `FLAG_ACTIVITY_NEW_TASK` 一起使用** - 单独使用可能无效,一般需要组合: ```java intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); ``` --- ### **适用场景** - **用户登出后跳转登录页**:清空所有历史 Activity,防止返回。 - **深层链接跳转首页**:避免返回时看到中间页(如广告页)。 - **强制重置任务栈**:类似“重启应用”的效果。 --- ### **对比其他 Flags** | Flag | 行为 | |-------------------------------|----------------------------------------------------------------------| | `FLAG_ACTIVITY_CLEAR_TASK` | 清空整个任务栈,新 Activity 成为唯一根。 | | `FLAG_ACTIVITY_CLEAR_TOP` | 仅清除目标 Activity **之上的** Activity(类似 `singleTask`)。 | | `FLAG_ACTIVITY_NEW_TASK` | 创建新任务栈(非 Activity Context 必需)。 | --- ### **注意事项** 1. **数据丢失风险** - 清空栈时会销毁所有 Activity,未保存的数据会丢失。 2. **不能单独使用** - 必须搭配 `FLAG_ACTIVITY_NEW_TASK`,否则可能不生效。 3. **与 `Manifest` 启动模式的关系** - 动态 Flags 优先级高于静态 `launchMode`,会覆盖其行为。 ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

u010142437

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值