安卓Activity 跳转的标记深度思考FLAG_ACTIVITY_NEW_TASK,singleTask

本文详细探讨了 Android 中的 Task Affinity 属性及其与 FLAG_ACTIVITY_NEW_TASK 的关系,通过具体示例说明了如何利用这些特性来控制 Activity 在不同任务间的组织方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

知识储备参考地址:http://blog.youkuaiyun.com/ljz2009y/article/details/26621815

FLAG_ACTIVITY_NEW_TASK
标记了FLAG_ACTIVITY_NEW_TASK,就一定会创建一个新的TASK吗,实验证明这是一个必要条件,还要结合taskAffinity来看,
A .如果和H5Activity 具有相应的亲戚存在了,那么只是会把H5Activity 加入的亲缘的TASK中
B. 如果和H5Activity 没有对应的亲缘关系的TASK,那么就会创建一个新的TASK了

public static void
startActivity(Context context, Bundle extras) { Intent intent = new Intent(context, H5Activity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); if (extras != null) intent.putExtras(extras); context.startActivity(intent);}

应用场景举例
会想一下,我们打开升级面板(和当前应用的TASK亲缘关系肯定不同)的时候是不是增加了一个FLAG_ACTIVITY_NEW_TASK,从而避免升级界面加入当前应用的TASK,
从而避免升级过程中应用推出导致升级面板也退出的情况




singleTask


这个属性其实被会系统当作FLAG_ACTIVITY_NEW_TASK 理解,这里我们把亲缘关系设置为其他APP的包名(一个APP的默认亲缘关系就是包名),
那么另外一个APP的在进程中是维持在首页的(other app HomeActivity),和SencondActivity 属于相同的TASK,返回或者 finish掉都是回到 
上一个界面(HomeActivity,当然前提是另外一个HomeActivity得在任务栈中)

    <activity
        android:name=".SenondActivity"
        android:launchMode="singleTask"
        android:taskAffinity="com.otherapp.package"
        >
    </activity>



public class SenondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_senond);
        findViewById(R.id.testTv2).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                finish();
            }
        });
    }
}
关于空taskAffinity的测试结论:
taskAffinity如果为空,那么空taskAffinity之间的TASK没有亲缘关系,展示如下


不为空有亲缘关系的展示如下



### 实现跨应用程序 SingleTask Activity 跳转 在 Android 中,`singleTask` 启动模式允许一个 `Activity` 在整个任务栈中仅存在一次实例。当尝试启动该 `Activity` ,如果其已经在任务栈中,则会将其带到前台并重用现有的实例。 为了实现两个不同应用程序之间通过 `singleTask` 模式的 `Activity` 进行跳转: #### 配置目标 Application 的 Manifest 文件 确保接收方应用的目标 `Activity` 设置了合适的属性来支持单次任务行为[^2]: ```xml <activity android:name=".TargetActivity" android:launchMode="singleTask" android:taskAffinity="" android:excludeFromRecents="true"> <!-- Intent Filter --> </activity> ``` - `android:launchMode="singleTask"` 表明此活动在整个系统范围内只会有一个实例。 - `android:taskAffinity=""` 取消默认的任务亲和力设置,使得这个 `Activity` 不会被放置到发起者的任务堆栈里而是创建新的独立任务栈。 - `android:excludeFromRecents="true"` 将防止该 `Activity` 出现在最近使用的程序列表中。 #### 发起端 Application 的处理方式 发送意图(Intent)给另一个应用程序中的特定 `Activity`: ```java // 创建显式 intent 或者隐式 intent 并指定要打开的应用包名与类路径 Intent intent = new Intent(Intent.ACTION_VIEW); intent.setClassName("com.example.targetapp", "com.example.targetapp.TargetActivity"); // 添加标记FLAG_ACTIVITY_NEW_TASKFLAG_ACTIVITY_CLEAR_TOP 来确保按照 singleTask 方式启动 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); context.startActivity(intent); // context 是 Context 类型的对象比如 Activity 或 Service ``` 上述代码片段展示了如何配置源应用程序以正确的方式向目的应用程序传递请求,并且遵循了 `singleTask` 的启动逻辑[^1]。 #### 接收端 Application 对应的处理机制 在接收到广播或者其他形式的通知之后,可以通过覆盖 `onNewIntent()` 方法捕获传入的新意图数据: ```java @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent); // 更新当前 activity 的 intent // 处理新传来的参数... } ``` 这一步骤非常重要,因为每当有新的意图指向同一个 `singleTask` 活动,它不会被销毁重建而只是回调此函数以便开发者可以获取最新的输入信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值