ContentProvider启动时机问题简记

ContentProvider在应用启动时由ActivityThread主线程负责启动。SQLiteOpenHelper的子类在ContentProvider的onCreate中初始化,但SQLiteDatabase实例在首次执行数据库操作时创建。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天代码中用到了自定义的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 实例。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值