Android中的app在AndroidManifest.xml中可以指定进程类,例如:
<application android:name="PhoneApp"
android:persistent="true"
android:label="@string/phoneAppLabel"
android:icon="@mipmap/ic_launcher_phone"
android:allowBackup="false"
android:supportsRtl="true"
android:usesCleartextTraffic="true">
指定了PhoneApp类,PhoneApp类必然是要继承Application类的:
public class PhoneApp extends Application {
Application类中可以重写OnCreate方法
@Override
public void onCreate() {
一般在这个函数中可以做一些拥有进程生命周期数据结构的初始化工作,例如查询归属地的结构初始化,这样之后查询归属地直接调用接口即可,不用在每个调用的地方都要考虑初始化的问题。但是最近遇到了问题,本来应该在OnCreate中初始化的数据结构居然是null,百思不得姐呀。
不过在Android源码注释中很明白了:
/**
* Called when the application is starting, before any activity, service,
* or receiver objects (excluding content providers) have been created.
* Implementations should be as quick as possible (for example using
* lazy initialization of state) since the time spent in this function
* directly impacts the performance of starting the first activity,
* service, or receiver in a process.
* If you override this method, be sure to call super.onCreate().
*/
@CallSuper
public void onCreate() {
}
Application的OnCreate方法在任意activity、service或者receiver创建的时候必然会被调用(content provider除外!content provider除外!!content provider除外!!!)
出问题的就是一个ContentProvider中的代码
2017.10.20更正
onCreate是一定会走的不过时机对ContentProvider来说有点特别。参见
http://weishu.me/2016/07/12/understand-plugin-framework-content-provider/
仔细观察以上代码,你会发现:ContentProvider的安装比Application的onCreate回调还要早!!因此,分析到这里我们已经明白了前面提出的那个问题,进程启动之后会在Applition类的onCreate 回调之前,在Application对象创建之后完成ContentProvider的安装。