來自 Android Debug Database
http://blog.csdn.net/qq_25806863/article/details/62216763
問題
在使用Android Debug Database的時(shí)候焰雕,我發(fā)現(xiàn)僅僅是加一行引用就行了
debugCompile 'com.amitshekhar.android:debug-db:1.0.0'
代碼中沒有寫一點(diǎn)點(diǎn)關(guān)于這個(gè)庫的代碼鸵隧。自定義控件那種就不說了篡诽,用到的時(shí)候肯定會(huì)調(diào)用的。而一些工具庫最起碼也要在Application的onCreate()方法中寫一行代碼什么的,需要配置一些id的這樣還可以,l例如微信這些句携。還有些就僅僅是依據(jù)初始化:
public class DemoApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
LeakCanary.install(this);//像這樣的。
APICloud.initialize(this);
//微信 appid appsecret
PlatformConfig.setWeixin("wxbe344a7447dcf578f", "df0e35026180c930e30335436e149c7b6");
api = WXAPIFactory.createWXAPI(getApplicationContext(), "wxbe4d346a747d4f4578f");
api.registerApp("wxb34a747dc43f578f");
}
}
發(fā)現(xiàn)
我就好奇Android Debug Database是怎么做的了允乐。
看源碼的時(shí)候發(fā)現(xiàn)务甥,Android Debug Database里面寫了一個(gè)內(nèi)容提供者DebugDBInitProvider。代碼很簡(jiǎn)單喳篇,覺得在寫library的時(shí)候有時(shí)可以用下敞临。
public class DebugDBInitProvider extends ContentProvider {
public DebugDBInitProvider() {
}
@Override
public boolean onCreate() {
Log.i(TAG, "onCreate: DebugDBInitProvider");
DebugDB.initialize(getContext());
return true;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
return null;
}
@Override
public String getType(Uri uri) {
return null;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
return null;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
return 0;
}
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
return 0;
}
@Override
public void attachInfo(Context context, ProviderInfo providerInfo) {
if (providerInfo == null) {
throw new NullPointerException("DebugDBInitProvider ProviderInfo cannot be null.");
}
// So if the authorities equal the library internal ones, the developer forgot to set his applicationId
if ("com.amitshekhar.DebugDBInitProvider".equals(providerInfo.authority)) {
throw new IllegalStateException("Incorrect provider authority in manifest. Most likely due to a "
+ "missing applicationId variable in application\'s build.gradle.");
}
super.attachInfo(context, providerInfo);
}
}
這個(gè)provider幾乎就是個(gè)空的,只是在onCreate()方法中執(zhí)行了一下DebugDB.initialize(getContext());
而這個(gè)方法就是這個(gè)類庫的入口麸澜。為什么要寫成這樣的呢挺尿?
把這行代碼注釋掉,然后在自己的Application中寫上炊邦,能達(dá)到一樣的效果:
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
DebugDB.initialize(getApplicationContext());
Log.i(TAG, "onCreate: Application");
}
}
結(jié)果
個(gè)人認(rèn)為這個(gè)provider的作用就是方便其他人使用這個(gè)類庫编矾。不需要集成Application,不需要寫那行列代碼馁害。
原因就是provider的onCreate()會(huì)在application的onCreate()之前執(zhí)行窄俏,。碘菜。凹蜈。不知道理解有沒有錯(cuò):