Android应用程序组件Content Provider的启动过程源代码分析(6)
-
public final class ActivityThread {
-
......
-
-
private final IContentProvider installProvider(Context context,
-
IContentProvider provider, ProviderInfo info, boolean noisy) {
-
ContentProvider localProvider = null;
-
if (provider == null) {
-
......
-
-
Context c = null;
-
ApplicationInfo ai = info.applicationInfo;
-
if (context.getPackageName().equals(ai.packageName)) {
-
c = context;
-
} else if (mInitialApplication != null &&
-
mInitialApplication.getPackageName().equals(ai.packageName)) {
-
c = mInitialApplication;
-
} else {
-
try {
-
c = context.createPackageContext(ai.packageName,
-
Context.CONTEXT_INCLUDE_CODE);
-
} catch (PackageManager.NameNotFoundException e) {
-
}
-
}
-
-
......
-
-
try {
-
final java.lang.ClassLoader cl = c.getClassLoader();
-
localProvider = (ContentProvider)cl.
-
loadClass(info.name).newInstance();
-
provider = localProvider.getIContentProvider();
-
......
-
-
// XXX Need to create the correct context for this provider.
-
localProvider.attachInfo(c, info);
-
} catch (java.lang.Exception e) {
-
......
-
}
-
-
} else if (localLOGV) {
-
......
-
}
-
-
synchronized (mProviderMap) {
-
// Cache the pointer for the remote provider.
-
String names[] = PATTERN_SEMICOLON.split(info.authority);
-
for (int i=0; i<names.length; i++) {
-
ProviderClientRecord pr = new ProviderClientRecord(names[i], provider,
-
localProvider);
-
try {
-
provider.asBinder().linkToDeath(pr, 0);
-
mProviderMap.put(names[i], pr);
-
} catch (RemoteException e) {
-
return null;
-
}
-
}
-
if (localProvider != null) {
-
mLocalProviders.put(provider.asBinder(),
-
new ProviderClientRecord(null, provider, localProvider));
-
}
-
}
-
-
return provider;
-
}
-
-
......
-
}
-
final java.lang.ClassLoader cl = c.getClassLoader();
-
localProvider = (ContentProvider)cl.
-
loadClass(info.name).newInstance();
-
public abstract class ContentProvider implements ComponentCallbacks {
-
......
-
-
private Transport mTransport = new Transport();
-
-
......
-
-
class Transport extends ContentProviderNative {
-
......
-
}
-
-
public IContentProvider getIContentProvider() {
-
return mTransport;
-
}
-
-
......
-
}
回到前面的installProvider函数中,它接下来调用下面接口来初始化刚刚加载好的Content Provider:
-
// XXX Need to create the correct context for this provider.
-
localProvider.attachInfo(c, info);
-
public abstract class ContentProvider implements ComponentCallbacks {
-
......
-
-
public void attachInfo(Context context, ProviderInfo info) {
-
/*
-
* Only allow it to be set once, so after the content service gives
-
* this to us clients can't change it.
-
*/
-
if (mContext == null) {
-
mContext = context;
-
mMyUid = Process.myUid();
-
if (info != null) {
-
setReadPermission(info.readPermission);
-
setWritePermission(info.writePermission);
-
setPathPermissions(info.pathPermissions);
-
mExported = info.exported;
-
}
-
ContentProvider.this.onCreate();
-
}
-
}
-
-
......
-
}
-
public class ArticlesProvider extends ContentProvider {
-
......
-
-
@Override
-
public boolean onCreate() {
-
Context context = getContext();
-
resolver = context.getContentResolver();
-
dbHelper = new DBHelper(context, DB_NAME, null, DB_VERSION);
-
-
return true;
-
}
-
-
......
-
}
-
synchronized (mProviderMap) {
-
// Cache the pointer for the remote provider.
-
String names[] = PATTERN_SEMICOLON.split(info.authority);
-
for (int i=0; i<names.length; i++) {
-
ProviderClientRecord pr = new ProviderClientRecord(names[i], provider,
-
localProvider);
-
try {
-
provider.asBinder().linkToDeath(pr, 0);
-
mProviderMap.put(names[i], pr);
-
} catch (RemoteException e) {
-
return null;
-
}
-
}
-
if (localProvider != null) {
-
mLocalProviders.put(provider.asBinder(),
-
new ProviderClientRecord(null, provider, localProvider));
-
}
-
}