zoukankan      html  css  js  c++  java
  • Contentprovider 注册 启动简单流程

    安装app时packagemanager 读取manixfest获取provider信息 存在数据库里
    流程:
    1、加载ActivityThread main方法,创建消息队列。ActivityThread.main:
    Looper.prepareMainLooper();
    ActivityThread thread = new ActivityThread();
    thread.attach(false); (2)
    sMainThreadHandler = thread.getHandler();
    Looper.loop();

    2、ActivityThread.attach:
    final IActivityManager mgr = ActivityManagerNative.getDefault();
    mgr.attachApplication(mAppThread); //IPC把ApplicationThread 传递给AMS (3)
    mInstrumentation = new Instrumentation();
    ContextImpl context = ContextImpl.createAppContext(this, getSystemContext().mPackageInfo);
    mInitialApplication = context.mPackageInfo.makeApplication(true, null);

    3、ActivityManagerService.attachApplication => ActivityManagerService.attachApplicationLocked:
    List<ProviderInfo> providers = normalMode ? generateApplicationProvidersLocked(app) //获取packageManager中这个包注册的provider信息
    thread.bindApplication(processName, appInfo, providers, ...) //IPC调用app端的bindApplication

    4. ActivityThread.bindApplication => ActivityThread.handleBindApplication
    List<ProviderInfo> providers = data.providers;
    installContentProviders(app, providers); (5)
    mInstrumentation.callApplicationOnCreate(app); // call Application.onCreate()

    5. ActivityThread.installContentProviders:
    IActivityManager.ContentProviderHolder cph = installProvider(context, null, cpi, false, true, true); //实例化provider类
    results.add(cph);
    ActivityManagerNative.getDefault().publishContentProviders(getApplicationThread(), results); //发布到AMS

    6. ActivityManagerService.publishContentProviders: //把ContentProviderRecord存储起来,放到mProviderMap中去
    ContentProviderRecord dst = r.pubProviders.get(src.info.name);
    ComponentName comp = new ComponentName(dst.info.packageName, dst.info.name);
    mProviderMap.putProviderByClass(comp, dst);


    调用contentprovider:
    当调用ContentProvider的insert、delete、update、query方法中的任何一个时,如果ContentProvider所在的进程没有启动的话,
    那么就会触发ContentProvider的创建,并伴随着ContentProvider所在进程的启动。


    1. ApplicationContentResolver.acquireProvider:
    holder = ActivityManagerNative.getDefault().getContentProvider(
    getApplicationThread(), auth, userId, stable); //从AMS获取contentprovider的binder


    2. ActivityManagerService.getContentProviderImpl
    //先从mProviderMap中找已经publish的provider 返回这个provider
    ContentProviderRecord cpr = mProviderMap.getProviderByName(name, userId);
    //如果cpr不存在
    ProviderInfo cpi = AppGlobals.getPackageManager().resolveContentProvider(name, STOCK_PM_FLAGS | PackageManager.GET_URI_PERMISSION_PATTERNS, UserHandle.USER_OWNER);
    cpr = new ContentProviderRecord(this, cpi, ai, comp, singleton);
    //获取provider所在进程
    ProcessRecord proc = getProcessRecordLocked(cpi.processName, cpr.appInfo.uid, false);
    if (proc != null && proc.thread != null) {
    //如果已启动
    proc.thread.scheduleInstallProvider(cpi);
    } else {
    proc = startProcessLocked(cpi.processName,
    cpr.appInfo, false, 0, "content provider",
    new ComponentName(cpi.applicationInfo.packageName,
    cpi.name), false, false, false);
    }
    //等待直到provider publish成功

  • 相关阅读:
    centos 搭建 sftp 服务器
    apt-get 安装时,提示lock被占用
    Kafka
    设计模式-分类
    SparkSQL – 从0到1认识Catalyst
    Spark分布式计算引擎
    Spark存储管理
    Spart RDD
    硬件工程师的你也不想一辈子画图、调板子吧!!!
    如何理解IPD+CMMI+Scrum一体化研发管理解决方案之Scrum篇
  • 原文地址:https://www.cnblogs.com/hushpa/p/6674483.html
Copyright © 2011-2022 走看看