android:taskAffinity属性的简单测试

本文详细解析了TaskAffinity属性的作用,通过具体示例展示了不同TaskAffinity设置下Activity的启动行为,包括如何将Activity置于不同的任务中。

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

说明:

1,  com.gionee.filemanager/.FileExplorerTabActivity这个Activity启动com.gionee.filemanager/.privatespace.PrivateActivity

2,  其中com.gionee.filemanager/.privatespace.PrivateActivity添加了如下taskAffinity属性

android:taskAffinity=".private"

3,  com.gionee.filemanager/.FileExplorerTabActivity没有显示添加taskAffinity属性

测试结果如下:

两个Activity启动到了不同的Task中。


ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities)

Display #0 (activities from top to bottom):
  Stack #1:
  mFullscreen=true
  mBounds=null
    Task id #226
    mFullscreen=true
    mBounds=null
    mMinWidth=-1
    mMinHeight=-1
    mLastNonFullscreenBounds=null
    * TaskRecord{577c95 #226 A=.private U=0 StackId=1 sz=1}
      userId=0 effectiveUid=u0a42 mCallingUid=u0a42 mUserSetupComplete=true mCallingPackage=com.gionee.filemanager
      affinity=.private
      intent={flg=0x10800000 cmp=com.gionee.filemanager/.privatespace.PrivateActivity}
      realActivity=com.gionee.filemanager/.privatespace.PrivateActivity
      autoRemoveRecents=false isPersistable=false numFullscreen=1 taskType=0 mTaskToReturnTo=0
      rootWasReset=false mNeverRelinquishIdentity=true mReuseTask=false mLockTaskAuth=LOCK_TASK_AUTH_PINNABLE
      Activities=[ActivityRecord{c05944c u0 com.gionee.filemanager/.privatespace.PrivateActivity t226}]
      askedCompatMode=false inRecents=true isAvailable=true
      lastThumbnail=null lastThumbnailFile=/data/system_ce/0/recent_images/226_task_thumbnail.png
      stackId=1
      hasBeenVisible=true mResizeMode=RESIZE_MODE_UNRESIZEABLE isResizeable=false firstActiveTime=1495779462251 lastActiveTime=1495779462251 (inactive for 1s)
      * Hist #0: ActivityRecord{c05944c u0 com.gionee.filemanager/.privatespace.PrivateActivity t226}
          packageName=com.gionee.filemanager processName=com.gionee.filemanager
          launchedFromUid=10042 launchedFromPackage=com.gionee.filemanager userId=0
          app=ProcessRecord{4932993 16972:com.gionee.filemanager/u0a42}
          Intent { flg=0x10800000 cmp=com.gionee.filemanager/.privatespace.PrivateActivity }
          frontOfTask=true task=TaskRecord{577c95 #226 A=.private U=0 StackId=1 sz=1}
          taskAffinity=.private
          realActivity=com.gionee.filemanager/.privatespace.PrivateActivity
          baseDir=/data/app/com.gionee.filemanager-2/base.apk
          dataDir=/data/user/0/com.gionee.filemanager
          stateNotNeeded=false componentSpecified=true mActivityType=0
          compat={320dpi} labelRes=0x7f09002e icon=0x7f0201dc theme=0x7f080025
          config={0.9 default ?mcc?mnc [zh_CN,en_US] ldltr sw360dp w360dp h616dp 320dpi nrml long port finger -keyb/v/h -nav/h s.6}
          taskConfigOverride={1.0 default ?mcc?mnc ?localeList ?layoutDir ?swdp ?wdp ?hdp ?density ?lsize ?long ?orien ?uimode ?night ?touch ?keyb/?/? ?nav/?}
          taskDescription: iconFilename=null label="null" color=fff5f5f5
          launchFailed=false launchCount=1 lastLaunchTime=-1s836ms
          haveState=false icicle=null
          state=RESUMED stopped=false delayedResume=false finishing=false
          keysPaused=false inHistory=true visible=true sleeping=false idle=true mStartingWindowState=STARTING_WINDOW_SHOWN
          fullscreen=true noDisplay=false immersive=false launchMode=2
          frozenBeforeDestroy=false forceNewConfig=false
          mActivityType=APPLICATION_ACTIVITY_TYPE
          waitingVisible=false nowVisible=true lastVisibleTime=-1s566ms
          resizeMode=RESIZE_MODE_UNRESIZEABLE
    Task id #225
    mFullscreen=true
    mBounds=null
    mMinWidth=-1
    mMinHeight=-1
    mLastNonFullscreenBounds=null
    * TaskRecord{53dcede #225 A=com.gionee.filemanager U=0 StackId=1 sz=1}
      userId=0 effectiveUid=u0a42 mCallingUid=u0a38 mUserSetupComplete=true mCallingPackage=com.gionee.amisystem
      affinity=com.gionee.filemanager
      intent={act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.gionee.filemanager/.FileExplorerTabActivity}
      realActivity=com.gionee.filemanager/.FileExplorerTabActivity
      autoRemoveRecents=false isPersistable=true numFullscreen=1 taskType=0 mTaskToReturnTo=1
      rootWasReset=true mNeverRelinquishIdentity=true mReuseTask=false mLockTaskAuth=LOCK_TASK_AUTH_PINNABLE
      Activities=[ActivityRecord{7f1dca0 u0 com.gionee.filemanager/.FileExplorerTabActivity t225}]
      askedCompatMode=false inRecents=true isAvailable=true
      lastThumbnail=null lastThumbnailFile=/data/system_ce/0/recent_images/225_task_thumbnail.png
      stackId=1
      hasBeenVisible=true mResizeMode=RESIZE_MODE_UNRESIZEABLE isResizeable=false firstActiveTime=1495779462221 lastActiveTime=1495779462221 (inactive for 1s)
      * Hist #0: ActivityRecord{7f1dca0 u0 com.gionee.filemanager/.FileExplorerTabActivity t225}
          packageName=com.gionee.filemanager processName=com.gionee.filemanager
          launchedFromUid=10038 launchedFromPackage=com.gionee.amisystem userId=0
          app=ProcessRecord{4932993 16972:com.gionee.filemanager/u0a42}
          Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.gionee.filemanager/.FileExplorerTabActivity bnds=[528,444][696,636] }
          frontOfTask=true task=TaskRecord{53dcede #225 A=com.gionee.filemanager U=0 StackId=1 sz=1}
          taskAffinity=com.gionee.filemanager
          realActivity=com.gionee.filemanager/.FileExplorerTabActivity
          baseDir=/data/app/com.gionee.filemanager-2/base.apk
          dataDir=/data/user/0/com.gionee.filemanager
          stateNotNeeded=false componentSpecified=true mActivityType=0
          compat={320dpi} labelRes=0x7f09002e icon=0x7f0201dc theme=0x7f080025
          config={0.9 default ?mcc?mnc [zh_CN,en_US] ldltr sw360dp w360dp h616dp 320dpi nrml long port finger -keyb/v/h -nav/h s.6}
          taskConfigOverride={1.0 default ?mcc?mnc ?localeList ?layoutDir ?swdp ?wdp ?hdp ?density ?lsize ?long ?orien ?uimode ?night ?touch ?keyb/?/? ?nav/?}
          taskDescription: iconFilename=null label="null" color=fff5f5f5
          launchFailed=false launchCount=0 lastLaunchTime=-1m2s664ms
          haveState=true icicle=Bundle[EMPTY_PARCEL]
          state=STOPPED stopped=true delayedResume=false finishing=false
          keysPaused=false inHistory=true visible=false sleeping=false idle=true mStartingWindowState=STARTING_WINDOW_SHOWN
          fullscreen=true noDisplay=false immersive=false launchMode=1
          frozenBeforeDestroy=false forceNewConfig=false
          mActivityType=APPLICATION_ACTIVITY_TYPE
          waitingVisible=false nowVisible=false lastVisibleTime=-1m2s87ms
          connections=[ConnectionRecord{34cffc4 u0 CR com.android.providers.media/.MediaScannerService:@5457ad7}, ConnectionRecord{254e5e2 u0 CR com.android.providers.media/.MediaScannerService:@34ecead}, ConnectionRecord{65e8edf u0 CR com.android.providers.media/.MediaScannerService:@e13b97e}, ConnectionRecord{9b4d5f5 u0 CR com.android.providers.media/.MediaScannerService:@544f72c}]
          resizeMode=RESIZE_MODE_UNRESIZEABLE

    Running activities (most recent first):
      TaskRecord{577c95 #226 A=.private U=0 StackId=1 sz=1}
        Run #1: ActivityRecord{c05944c u0 com.gionee.filemanager/.privatespace.PrivateActivity t226}
      TaskRecord{53dcede #225 A=com.gionee.filemanager U=0 StackId=1 sz=1}
        Run #0: ActivityRecord{7f1dca0 u0 com.gionee.filemanager/.FileExplorerTabActivity t225}

    mResumedActivity: ActivityRecord{c05944c u0 com.gionee.filemanager/.privatespace.PrivateActivity t226}
    mLastPausedActivity: ActivityRecord{7f1dca0 u0 com.gionee.filemanager/.FileExplorerTabActivity t225}



参考:

http://blog.youkuaiyun.com/chenshijun0101/article/details/9409193


<think>嗯,用户想了解如何正确配置Android中的taskAffinity属性。首先,我需要回忆一下taskAffinity的基本概念。taskAffinity是Activity的一个属性,用来指定它属于哪个任务栈。通常,应用的默认任务栈是包名,但如果有需要,可以自定义。 接下来,用户可能需要知道配置方法,比如在AndroidManifest.xml中如何设置。记得语法是android:taskAffinity="...",通常和launchMode一起使用,比如singleTask。然后,用户可能需要示例来说明不同场景下的应用,比如不同模块的任务栈分离,或者与FLAG_ACTIVITY_NEW_TASK配合使用的情况。 还要注意,当使用taskAffinity时,如果启动模式是singleTask,系统会寻找匹配的栈,没有的话会新建。这点需要解释清楚,避免误解。此外,用户可能关心实际应用中的注意事项,比如包名格式、与launchMode的配合,以及可能的安全问题。 参考提供的引用内容,引用2和3提到了不同场景和栈的管理,需要结合这些信息来组织回答。确保示例代码正确,并且解释清楚每个场景的作用。最后,生成的相关问题需要覆盖用户可能进一步询问的方向,比如与启动模式的关系、多任务栈的影响以及常见错误。</think>### Android taskAffinity 配置方法及示例 `taskAffinity` 是 Android 中用于定义 Activity 所属任务栈的关键属性,与启动模式(`launchMode`)配合使用可实现多任务栈管理。以下是配置方法和典型场景: --- #### **1. 基础配置语法** 在 `AndroidManifest.xml` 中为 Activity 添加 `taskAffinity` 属性: ```xml <activity android:name=".YourActivity" android:taskAffinity="自定义任务栈名称" android:launchMode="singleTask" /> ``` - **默认值**:应用包名(如 `com.example.app`)[^3] - **命名规则**:建议使用反向域名格式(如 `com.example.module.pay`) --- #### **2. 典型使用场景** ##### **场景一:隔离功能模块** 为支付功能单独分配任务栈,避免与其他界面混合: ```xml <activity android:name=".PayActivity" android:taskAffinity="com.example.app.pay" android:launchMode="singleTask" /> ``` - **效果**:启动 `PayActivity` 时,系统优先在 `com.example.app.pay` 任务栈中查找实例,若不存在则新建栈 ##### **场景二:跨应用复用任务栈** 与 `FLAG_ACTIVITY_NEW_TASK` 结合,实现从通知栏跳转到独立登录栈: ```java Intent intent = new Intent(context, LoginActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent); ``` 对应 Manifest 配置: ```xml <activity android:name=".LoginActivity" android:taskAffinity="com.example.app.login" /> ``` - **效果**:`LoginActivity` 会被放入 `com.example.app.login` 栈中,与应用主栈隔离[^2] --- #### **3. 关键机制** 1. **任务栈匹配规则**: - 当通过 `singleTask` 启动 Activity 时,系统优先在与其 `taskAffinity` 匹配的栈中查找实例 - 若目标栈不存在,则自动创建新栈 2. **实例复用逻辑**: - 若目标栈已存在该 Activity 实例,会将其上方所有 Activity 出栈,并回调 `onNewIntent()` --- #### **4. 注意事项** - **与启动模式强相关**:`taskAffinity` 仅在 `singleTask` 或 `FLAG_ACTIVITY_NEW_TASK` 时生效 - **避免滥用**:过多任务栈会增加系统资源消耗 - **安全限制**:跨应用使用时需确保 `taskAffinity` 唯一性,防止任务栈冲突 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值