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成功

  • 相关阅读:
    日报9.4
    日报9.3
    低级错误整理
    树状数组求逆序对 笔记与思路整理
    st表、树状数组与线段树 笔记与思路整理
    Luogu P1098 字符串的展开
    Luogu P1816 忠诚
    jmeter cookie管理器 使用方法---新手学习记录1
    kali nessus 安装插件失败解决方法
    https tomcat 证书搭建
  • 原文地址:https://www.cnblogs.com/hushpa/p/6674483.html
Copyright © 2011-2022 走看看