今天无意间发现支付宝一个APP可以有多个后台任务,类似于下面这种情况

它是如何做到的呢?

  1. 每个 Activity 运行时都有一个其归属的 task栈,我们可以用 activity.getTaskId() 的方法得到当前 activity 的taskId。如果两个 activity 的 taskId 不同,则他们肯定不会属于同一个 task。
  2. 下面就是今天的重要属性 taskaffinity
 <activity
            android:name=".app.home.TestActivity"
            android:screenOrientation="portrait"
            android:launchMode="singleTask"
            android:taskAffinity=".DeliveryRecord"
            android:windowSoftInputMode="adjustPan" />

taskaffinity 可以单独对一个 activity 使用,代表该 activity 所想归属的 task;也能对application 使用,代表该 application 内声明的所有 activity 都归属于这个task。如果 activity 组件没有声明 taskAffinity 的话,该 activity 的 taskAffinity 属性也是有默认值的。如果 application 指定了 taskAffinity 值,默认值就是 application 指定的 taskAffinity 值;如果 application 未指定的话,默认值就是 manifest 中声明的包名(package 对应的字符串).Android 手机的任务列表就是根据不同 task 弹出的,我们可以根据任务管理器有几个 item 图标,来知道我们开启了几个 task。

  1. taskAffinity 单独使用并不会生效。
    要想其生效,需要配合其他属性使用,或者配合 Intent.FLAG_ACTIVITY_NEW_TASK,或者配合

allowTaskReparenting 。使用时用其中的一个就行。
例如上面的代码中我们就是直接使用launchMode = singleTask。同时,taskaffinity的命名也是有要求的,必须有"."或者以"."开头,类似这样".DeliveryRecord"或者"com.DeliveryRecord",单纯的使用"DeliveryRecord"会报错

The application could not be installed: INSTALL_PARSE_FAILED_MANIFEST_MALFORMED

最后我们就能得到想要的结果了。

最后修改:2021 年 07 月 22 日 09 : 32 AM
如果觉得我的文章对你有用,请随意赞赏