Android7.0 Messaging源码分析(2) - Application 创建篇

  Messaging 源码位于 packages/apps/Messaging 目录下,application类名是BugleApplication,

  在 onCreate 方法里做了两件事,
  1 FactoryImpl.register(getApplicationContext(), this);
  2 Thread.setDefaultUncaughtExceptionHandler(this);

  来看看FactoryImpl.register(getApplicationContext(), this);做了什么事情,

         public static Factory register(final Context applicationContext, final BugleApplication application) {
         // This only gets called once (from BugleApplication.onCreate), but its not called in tests.
         Assert.isTrue(!sRegistered);
         Assert.isNull(Factory.get());

         final FactoryImpl factory = new FactoryImpl();
         Factory.setInstance(factory);
         sRegistered = true;

         // At this point Factory is published. Services can now get initialized and depend on Factory.get().
         factory.mApplication = application;
         factory.mApplicationContext = applicationContext;
         factory.mMemoryCacheManager = new MemoryCacheManager(); // 创建缓缓管理器
         factory.mMediaCacheManager = new BugleMediaCacheManager(); // 创建媒体缓存管理器
         factory.mMediaResourceManager = new MediaResourceManager(); // 创建媒体资源管理器
         factory.mBugleGservices = new BugleGservicesImpl(applicationContext); // 创建Gservices实现类
         factory.mBugleApplicationPrefs = new BugleApplicationPrefs(applicationContext); // 创建 application prefs
         factory.mDataModel = new DataModelImpl(applicationContext); // 创建数据模型
         factory.mBugleWidgetPrefs = new BugleWidgetPrefs(applicationContext); // 创建 widget prefs
         factory.mUIIntents = new UIIntentsImpl(); // 创建UI intent 实现类
         factory.mContactContentObserver = new ContactContentObserver();
         factory.mMediaUtil = new MediaUtilImpl(); // 创建媒体工具类
         factory.mSubscriptionPrefs = new SparseArray<BugleSubscriptionPrefs>();
         factory.mCarrierConfigValuesLoader = new BugleCarrierConfigValuesLoader(applicationContext); // 创建运营商配置加载类

         Assert.initializeGservices(factory.mBugleGservices);
         LogUtil.initializeGservices(factory.mBugleGservices);

        // 如果已经获取了权限,就调用 onRequiredPermissionsAcquired 方法
         if (OsUtil.hasRequiredPermissions()) {
             factory.onRequiredPermissionsAcquired();
         }

         return factory;
     }

  前面创建了一大堆管理类,工具类;后面如果已获取了权限就调用了 onRequiredPermissionsAcquired 方法,没有获取权限就不调用。从调用关系看,没有获取权限时会展示 PermissionCheckActivity 页面,用户授予权限后会调用onRequiredPermissionsAcquired 方法;

  onRequiredPermissionsAcquired 方法如下:

     @Override
     public void onRequiredPermissionsAcquired() {
         if (sInitialized) {
             return;
         }
         sInitialized = true;

         mApplication.initializeSync(this);

         final Thread asyncInitialization = new Thread() {
             @Override
             public void run() {
                 Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
                 mApplication.initializeAsync(FactoryImpl.this);
             }
         };
         asyncInitialization.start();
     }

  它运行了一个同步方法,一个异步方法。分别如下,

100    // Called by the "real" factory from FactoryImpl.register() (i.e. not run in tests)
101    public void initializeSync(final Factory factory) {
102        Trace.beginSection("app.initializeSync");
103        final Context context = factory.getApplicationContext();
104        final BugleGservices bugleGservices = factory.getBugleGservices();
105        final BuglePrefs buglePrefs = factory.getApplicationPrefs();
106        final DataModel dataModel = factory.getDataModel();
107        final CarrierConfigValuesLoader carrierConfigValuesLoader =
108                factory.getCarrierConfigValuesLoader();
109
110        maybeStartProfiling();
111
112        BugleApplication.updateAppConfig(context); // 更新 app 配置信息
113
114        // Initialize MMS lib 初始化 MMS 类库
115        initMmsLib(context, bugleGservices, carrierConfigValuesLoader);
116        // Initialize APN database 初始化 APN 数据库
117        ApnDatabase.initializeAppContext(context);
118        // Fixup messages in flight if we crashed and send any pending 修复发送时应用程序崩溃的消息,发送所有待发送的消息
119        dataModel.onApplicationCreated();
120        // Register carrier config change receiver 注册运营商配置改变监听器
121        if (OsUtil.isAtLeastM()) {
122            registerCarrierConfigChangeReceiver(context);
123        }
124
125        Trace.endSection();
126    }

  这个同步方法做了一些比较重要的事情,比如初始化 MMS 类库,APN数据库等,还处理了待发送和发送失败的消息。

  来看异步方法,

164    // Called from thread started in FactoryImpl.register() (i.e. not run in tests)
165    public void initializeAsync(final Factory factory) {
166        // Handle shared prefs upgrade & Load MMS Configuration
167        Trace.beginSection("app.initializeAsync");
168        maybeHandleSharedPrefsUpgrade(factory); // 处理 pref 升级
169        MmsConfig.load(); // 加载 Mms 配置
170        Trace.endSection();
171    }

  异步方法做了处理 pref 和 Mms 配置。
  这两步完成 Application 创建流程就走完了。

  总结
  Messaging application创建过程主要做了下面几件事,

  • 创建MemoryCacheManager,MediaResourceManager,MediaUtilImpl 等管理类,工具类。
  • 初始化 MMS 类库,配置项。
  • 处理应用崩溃时处在发送中以及待发送的信息。

版权声明:本文为wenping1980原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。