ResolverActivity / ChooserActivity的联系与区别

本文详细介绍了Android中ResolverActivity的逻辑,包括用户选择始终后的行为,涉及PackageManagerService的addPreferredActivity方法。同时,对比了ChooserActivity缺少仅一次和始终选项的特性。此外,探讨了系统和应用中ResolverActivity的运行进程,以及选择目标后如何通过ActivityTaskManagerService启动活动。整个流程涵盖了跨进程通信和Activity启动的关键步骤。
部署运行你感兴趣的模型镜像

1. ResolverActivity 提供 “仅一次” 和“始终选项”。

选择了始终后的逻辑

ResolverActivity.onTargetSelected
 pm.addUniquePreferredActivity(filter, bestMatch, set, intent.getComponent())

pm = getPackageManager(); //实际上是ApplicationPackageManager实例, 封装了真正的PMS

-> ContextImpl. getPackageManager() 
         pm = ActivityThread.getPackageManager(); //binder PMS
pm = mPackageManager = new ApplicationPackageManager(this, pm)

ApplicationPackageManager
mPM.addPreferredActivity(filter, match, set, activity, getUserId(), false);// PMS

//真正实现
PackageManagerService
addPreferredActivity(WatchedIntentFilter filter, int match,
            ComponentName[] set, ComponentName activity, boolean always, int userId,
            String opname, boolean removeExisting) {

2. ChooserActivity 继承了 ResolverActivity,

但是没有了  “仅一次” 和“始终选项” 这两个选项, 因此每一次都会弹出来选择。

public class ChooserActivity extends ResolverActivity implements
        ChooserListAdapter.ChooserListCommunicator,
        SelectableTargetInfoCommunicator {

3. 系统弹出来的 chooseractivity,

例如相册分享,它是运行在 android:ui 进程上

4. 一些应用弹出来的 resolveractivity

例如nfc 选择支付,它是运行在 com.android.nfc 进程上

5. 选择后, 调用了 ActivityTaskManagerService.startActivity/startActivityAsUser 启动

当然,先会跑resolveracitivity里的点击响应操作,调用栈如下:

onTargetSelected:1630, ResolverActivity (com.android.internal.app)
onTargetSelected:1435, ResolverActivity (com.android.internal.app)
startSelected:1324, ResolverActivity (com.android.internal.app)
onItemClick:2753, ResolverActivity$ItemClickListener (com.android.internal.app)
performItemClick:376, AdapterView (android.widget)
performItemClick:1282, AbsListView (android.widget)
run:3558, AbsListView$PerformClick (android.widget)

ResolverActivity 
-safelyStartActivityAsUser
-- safelyStartActivityInternal(TargetInfo cti, UserHandle user)

----> cti.startAsUser(this, null, user) 或者  cti.startAsCaller(this, null, tUserId) (两种)
接口TargetInfo 由 MultiDisplayResolveInfo实现,

然后调用 DisplayResolveInfo.startAsUserstartAsCaller
接着调用 activity.startActivityAsUser / startActivityAsCaller(mResolvedIntent, options, false, userId);
这里之后就是跨进程通信, app 通过 AIDL/Binder 调用 ActivityTaskManagerService startActivityAsUser / startActivity (system_server (wms))

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

<think> 首先,用户的问题是:“android/com.android.internal.app.ResolverActivity 这是什么?”我需要用中文回答。 这是一个Android相关的类名。ResolverActivity在Android系统中是用于处理Intent解析的Activity,具体来说,当系统需要用户选择一个应用来处理某个Intent(比如打开一个文件或链接)时,ResolverActivity会被调用。它显示一个对话框或列表,让用户选择可用的应用。 我的回答应该简洁明了: - 解释ResolverActivity的作用。 - 确保语言是中文。 - 回答后,必须提出3-5个相关问题,并以“§§相关问题§§”开头输出在末尾。 - 相关问题必须基于用户的问题和我的回答。 回答结构: 1. 定义ResolverActivity。 2. 简要描述其功能和用途。 3. 输出相关问题。 相关问题建议: 基于用户的问题(这是什么?),我的回答涉及Android内部类,所以相关问题可以围绕Android Intent处理、Activity生命周期、内部API等。 - 例如: 1. ResolverActivity在什么场景下被调用? 2. 如何自定义ResolverActivity的行为? 3. 在Android开发中,如何避免使用内部API? 4. ResolverActivity其他Activity有什么区别? 5. Intent解析的过程是怎样的? 确保有3-5个问题,格式为列表,每个问题以数字开头,如“1. ···”,并在“§§相关问题§§”之后。 完整回答格式: - 用中文回答核心问题。 - 然后,新的一行输出“§§相关问题§§”,接着是问题列表,不要换行分散,意味着问题应该在“§§相关问题§§”之后连续输出,每个问题用换行分隔,但“§§相关问题§§”必须独占一行。 示例格式中: ``` 快速排序的基本思想是... §§相关问题§§ 1. ··· 2. ··· 3. ··· ``` 所以,我需要: - 回答问题。 - 然后输出“§§相关问题§§”。 - 接着列出问题。 最终回答: - 回答部分:解释ResolverActivity。 - 相关问题:3-5个相关。 草拟回答: 回答:"ResolverActivity 是 Android 系统中的一个内部 Activity,用于显示一个选择器对话框,让用户选择处理特定 Intent 的应用程序。它是 com.android.internal.app 包的一部分,通常在启动一个 Intent 时,如果有多个应用可以处理该 Intent,系统会调用 ResolverActivity 来让用户选择。" 相关问题: 1. ResolverActivity 是如何启动的? 2. 开发者是否可以自定义 ResolverActivity 的界面? 3. 在 Android 开发中,为什么应该避免使用内部类如 ResolverActivity? 4. Intent 解析失败时会发生什么? 5. ResolverActivity 其他选择器 Activity 有什么不同? 确保问题数量和格式。 </think> ResolverActivity 是 Android 系统中的一个内部 Activity,属于 `com.android.internal.app` 包。它主要用于处理 Intent 解析过程:当用户发起一个操作(如打开一个文件或链接),而系统检测到有多个应用程序可以处理该 Intent 时,ResolverActivity 会被自动调用,显示一个选择器对话框或列表,让用户决定使用哪个应用来执行操作。例如,在点击一个 URL 时,系统可能会触发 ResolverActivity 让用户在浏览器列表中选择一个浏览器应用。注意,这是一个系统内部类,通常不建议开发者直接使用或修改,因为它依赖于 Android 框架的实现细节。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值