ContentProvider启动时机问题简记

来源:互联网 发布:ug轮廓3d倒角编程技巧 编辑:程序博客网 时间:2024/04/30 14:33

今天代码中用到了自定义的ContentProvider,除了在AndroidManifest.xml中<provider />的声明外:

<provider android:name="MyContentProvider" android:authorities="com.my.provider.MyProvider"/>,应用侧的代码并没有显示启动MyProvider的逻辑。

1. 那么ContentProvider是什么时候启动起来的?

MyProvider的onCreate方法的执行调用栈可知:

MyContentProvider.onCreate() line: 47
MyContentProvider(ContentProvider).attachInfo(Context, ProviderInfo, boolean) line: 1591
MyContentProvider(ContentProvider).attachInfo(Context, ProviderInfo) line: 1562
ActivityThread.installProvider(Context, IActivityManager$ContentProviderHolder, ProviderInfo, boolean, boolean, boolean) line: 5084
ActivityThread.installContentProviders(Context, List) line: 4673
ActivityThread.handleBindApplication(ActivityThread$AppBindData) line: 4613
ActivityThread.access$1800(ActivityThread, ActivityThread$AppBindData) line: 141
ActivityThread$H.handleMessage(Message) line: 1298
ActivityThread$H(Handler).dispatchMessage(Message) line: 102
Looper.loop() line: 136
ActivityThread.main(String[]) line: 5336
Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method]
Method.invoke(Object, Object...) line: 515
ZygoteInit$MethodAndArgsCaller.run() line: 871
ZygoteInit.main(String[]) line: 687
NativeStart.main(String[]) line: not available [native method]

MyProvider是由ActivityThread负责启动的,ActivityThread对应应用进程的主线程,即在应用进程启动时,会将ContentProvider启动起来。

2. ContentProvider启动起来后,ContentProvider所对应的数据库对象实例(SQLiteDatabase实例)又是什么时候启动的?

SQLiteDatabase实例并不会马上创建,而是在第一次执行数据库操作(query,insert,delete,update)的时候才会真正创建。

MyProvider中定义了继承与SQLiteOpenHelper的内部类:MySQLiteHelper,在MyProvider的onCreate方法中会初始化MySQLiteHelper的对象:而在执行

query,insert,delete,update时,会通过:

SQLiteDatabase db = mDbHelper.getWritableDatabase()方式真正的创建SQLiteDatabase 实例。

0 0
原创粉丝点击