导航
BlogJava
首页
新随笔
联系
聚合
管理
<
2011年2月
>
日
一
二
三
四
五
六
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
1
2
3
4
5
6
7
8
9
10
11
12
留言簿
(4)
给我留言
查看公开留言
查看私人留言
随笔分类
android(12)
(rss)
C++/C(3)
(rss)
cairo
(rss)
clearcase(1)
(rss)
Eclipse
(rss)
Java(25)
(rss)
Java Study(JavaThinking4)(8)
(rss)
Linux(9)
(rss)
Python(6)
(rss)
Semantic(3)
(rss)
Thinking in java 4 study
(rss)
Win(8)
(rss)
XML(2)
(rss)
随笔档案
2012年4月 (1)
2011年12月 (1)
2011年9月 (2)
2011年2月 (8)
2011年1月 (1)
2010年12月 (5)
2010年9月 (3)
2010年8月 (1)
2009年11月 (4)
2009年8月 (1)
2009年7月 (1)
2009年6月 (4)
2009年5月 (6)
2009年3月 (2)
2009年2月 (1)
2009年1月 (1)
2008年12月 (1)
2008年11月 (1)
2008年8月 (1)
2008年7月 (4)
2008年5月 (7)
2008年4月 (3)
2008年3月 (1)
2008年1月 (5)
2007年11月 (3)
2007年10月 (4)
2007年9月 (6)
2007年8月 (5)
阅读排行榜
1. onNewIntent 什么时候调用(6200)
2. 在JAVA中使用拖拽功能(2转)(2470)
3. Activitie之间传对象,通过Parcelable(转)(2132)
4. 关于java的JIT知识(转)(2130)
5. Swing的Jtable类(转载) (2079)
评论排行榜
1. 深入学习GridBagLayout(转)(2)
2. 在JAVA中使用拖拽功能(2转)(2)
3. rdf schema(转)(1)
4. JProfiler试用手记(转)(1)
5. onNewIntent 什么时候调用(1)
常用链接
我的随笔
我的评论
我的参与
最新评论
统计
随笔 - 83
文章 - 0
评论 - 8
引用 - 0
最新评论
1. re: onNewIntent 什么时候调用
写的很清晰!支持
--tingtingyang
2. re: JProfiler试用手记(转)
具体怎么 用啊,你说的太笼统啊
--小曾
3. re: 在JAVA中使用拖拽功能(2转)[未登录]
评论内容较长,点击标题查看
--jay
4. re: 深入学习GridBagLayout(转)[未登录]
相当不错的教程,感谢!!!
--Hunter
5. re: Python 内存管理 ref from: http://www.javaeye.com/topic/309753
Python 的确在某些方面很有优势
--bzp
ContentProvider分析
ContentProvider何时创建呢?这是一个值得深思的问题?
据我这两天的了解是在你要用到的时候才会调用ContentProvider的onCreate函数进行创建。你就会什么时候叫要用到的时候呢?比如你要查询或删除修改数据库的时候通过ContentResolver的quire或delete来操纵数据时就会调用ContentProvider的onCreate函数,若已经创建了数据库就不会再次创建。可以通过ContentResolver的源码来理解
Java代码
public
final
Cursor query(Uri uri, String[] projection,
String selection, String[] selectionArgs, String sortOrder) {
IContentProvider provider = acquireProvider(uri);
if
(provider ==
null
) {
return
null
;
}
try
{
Cursor qCursor = provider.query(uri, projection, selection, selectionArgs, sortOrder);
if
(qCursor ==
null
) {
releaseProvider(provider);
return
null
;
}
//Wrap the cursor object into CursorWrapperInner object
return
new
CursorWrapperInner(qCursor, provider);
}
catch
(RemoteException e) {
releaseProvider(provider);
return
null
;
}
catch
(RuntimeException e) {
releaseProvider(provider);
throw
e;
}
}
ContentResolver中的acquireProvider(uri)来获得对应的Provider.通过uri中的Authority的字段知道是要用哪个provider.也就是为什么要在Provider的menifester.xml中<provider.. android:authority="">.
下面对android的几个已有的Provider的进行说明一下:
1,SettingsProvider
Java代码
<!-- Permission to write Gservices in SettingsProvider -->
<permission android:name=
"android.permission.WRITE_GSERVICES"
android:label=
"@string/permlab_writeGservices"
android:description=
"@string/permdesc_writeGservices"
android:protectionLevel=
"signature"
/>
<application android:allowClearUserData=
"false"
android:label=
"Settings Storage"
android:icon=
"@drawable/ic_launcher_settings"
>
<provider android:name=
"SettingsProvider"
android:authorities=
"settings"
android:process=
"system"
android:multiprocess=
"false"
android:writePermission=
"android.permission.WRITE_SETTINGS"
android:initOrder=
"100"
/>
</application>
/manifest>
若你仔细查看SettingsProvider就会发现在它的manifester.xml中在android:process="system" 和android:sharedUserId="android.uid.system
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.providers.settings"
android:sharedUserId="android.uid.system">,我猜测它就是多了这两条语句使得系统加载完就加载它。若你注意开机的logcat就会发现
04-29 02:32:20.612: INFO/ActivityThread(79): Publishing provider settings: com.android.providers.settings.SettingsProvider
通过ActivityThread开始往上追你就会发现
从SystemServer.java中的
Java代码
Log.i(TAG,
"Starting System Content Providers."
);
ActivityManagerService.installSystemProviders();
到ActivityManagerService.java中的
Java代码
public
static
final
void
installSystemProviders() {
[color=blue]ProcessRecord app = mSelf.mProcessNames.get(
"system"
, Process.SYSTEM_UID);[/color]
List providers = mSelf.generateApplicationProvidersLocked(app);
mSystemThread.installSystemProviders(providers);
}
再到ActivityThread.java:
Java代码
public
final
void
installSystemProviders(List providers) {
if
(providers !=
null
) {
installContentProviders(mInitialApplication,
(List<ProviderInfo>)providers);
}
}
Java代码
private
final
void
installContentProviders(
Context context, List<ProviderInfo> providers) {
final
ArrayList<IActivityManager.ContentProviderHolder> results =
new
ArrayList<IActivityManager.ContentProviderHolder>();
Iterator<ProviderInfo> i = providers.iterator();
while
(i.hasNext()) {
ProviderInfo cpi = i.next();
StringBuilder buf =
new
StringBuilder(
128
);
buf.append(
"Publishing provider "
);
buf.append(cpi.authority);
buf.append(
": "
);
buf.append(cpi.name);
Log.i(TAG, buf.toString());
IContentProvider cp = installProvider(context,
null
, cpi,
false
);
if
(cp !=
null
) {
IActivityManager.ContentProviderHolder cph =
new
IActivityManager.ContentProviderHolder(cpi);
cph.provider = cp;
results.add(cph);
// Don't ever unload this provider from the process.
synchronized
(mProviderMap) {
mProviderRefCountMap.put(cp.asBinder(),
new
ProviderRefCount(
10000
));
}
}
}
2,CalendarProvider
Manifester.xml
Java代码
<receiver android:name=
"CalendarReceiver"
>
<intent-filter>
<action android:name=
"android.intent.action.BOOT_COMPLETED"
/>
</intent-filter>
</receiver> <provider android:name=
"CalendarProvider"
android:authorities=
"calendar"
android:syncable=
"true"
android:multiprocess=
"false"
android:readPermission=
"android.permission.READ_CALENDAR"
android:writePermission=
"android.permission.WRITE_CALENDAR"
/>
并不采用了SettingsProvider的方式而是通过了android.intent.action.BOOT_COMPLETED的方式:
CalendarReceiver.java
Java代码
public
class
CalendarReceiver
extends
BroadcastReceiver {
static
final
String SCHEDULE =
"com.android.providers.calendar.SCHEDULE_ALARM"
;
@Override
public
void
onReceive(Context context, Intent intent) {
String action = intent.getAction();
ContentResolver cr = context.getContentResolver();
CalendarProvider provider;
IContentProvider icp = cr.acquireProvider(
"calendar"
);
provider = (CalendarProvider) ContentProvider.
coerceToLocalContentProvider(icp);
if
(action.equals(SCHEDULE)) {
provider.scheduleNextAlarm(
false
/* do not remove alarms */
);
}
else
if
(action.equals(Intent.ACTION_BOOT_COMPLETED)) {
provider.bootCompleted();
}
cr.releaseProvider(icp);
}
}
posted on 2011-02-18 14:51
九宝
阅读(1856)
评论(0)
编辑
收藏
所属分类:
android
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
知识库
C++博客
博问
管理
相关文章:
ContentProvider分析
onNewIntent 什么时候调用
android register mimetype
Android Log Analysis
如何使Android应用程序获取系统权限【转】
Android Looper(转)
android : px dip(转)
drawable各个目录
(转) Android核心分析(22)-----Android应用框架之Activit
(转)Android核心分析(21)----Android应用框架之AndroidApplication
Powered by:
BlogJava
Copyright © 九宝