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.startAsUser/ startAsCaller
接着调用 activity.startActivityAsUser / startActivityAsCaller(mResolvedIntent, options, false, userId);
这里之后就是跨进程通信, app 通过 AIDL/Binder 调用 ActivityTaskManagerService 的 startActivityAsUser / startActivity (system_server (wms))