ContentProvider 源码分析---之二

2.1 AMS获取ContentProvider

AMS中的ContentProvider方法调用流程图如下,


AMS的getContentProviderImpl主要逻辑如下,

1,安全检查

if ((msg = checkContentProviderPermissionLocked(cpi, r, userId, checkCrossUser))!= null) {
    throw new SecurityException(msg);
}

2,调用PMS的resolveContentProvider方法匹配出目标ContentProvider注册的ContentProvider,这个匹配过程

和其他三大组件完全类似。

try {
    checkTime(startTime, "getContentProviderImpl: before resolveContentProvider");
    cpi = AppGlobals.getPackageManager().resolveContentProvider(name,
      STOCK_PM_FLAGS | PackageManager.GET_URI_PERMISSION_PATTERNS, userId);
    checkTime(startTime, "getContentProviderImpl: after resolveContentProvider");
} catch (RemoteException ex) {
}

3,如果目标ContentProvider的进程已经创建了,就调用目标ContentProvider的ActivityThread的scheduleInstallProvider

方法安装ContentProvider,

try {
   proc.thread.scheduleInstallProvider(cpi);
} catch (RemoteException e) {
}

4,如果目标ContentProvider的进程还未创建,就调用startProcessLocked方法创建进程,

proc = startProcessLocked(cpi.processName, cpr.appInfo, false, 0, "content provider",
  new ComponentName(cpi.applicationInfo.packageName, cpi.name), false, false, false);

创建进程在此就不论述了,在创建进程的过程中会安装ContentProvider。

5,等待目标ContentProvider的安装,

synchronized (cpr) {
            while (cpr.provider == null) {
                if (cpr.launchingApp == null) {
                    Slog.w(TAG, "Unable to launch app "
                            + cpi.applicationInfo.packageName + "/"
                            + cpi.applicationInfo.uid + " for provider "
                            + name + ": launching app became null");
                    EventLog.writeEvent(EventLogTags.AM_PROVIDER_LOST_PROCESS,
                            UserHandle.getUserId(cpi.applicationInfo.uid),
                            cpi.applicationInfo.packageName,
                            cpi.applicationInfo.uid, name);
                    return null;
                }
                try {
                    if (DEBUG_MU) Slog.v(TAG_MU,
                            "Waiting to start provider " + cpr
                            + " launchingApp
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值