使用Uri与Anction构造Intent,并导向Activity
本文转自blog.csdn/jimhard718/article/details/6191303
notepad++看看这句代码,看它启动的是那个Activity。
public static final String AUTHORITY = "le.provider.NotePad";
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/notes");
//CONTENT_URI 的实际内容
"content://le.provider.NotePad/notes"
Intent intent = getIntent();
if (Data() == null) {
intent.setData(Notes.CONTENT_URI);
}
startActivity(new Intent(Intent.ACTION_INSERT,
getIntent().getData()));
getIntent().getData()的返回值应该为CONTENT_URI
这种方式与我们经常使用的直接指定Intent的两个Activity的方式有所不同。下面我们详细的讲解下这据话所做的动作。
content://le.provider.NotePad/notes
/---------/ /------------------------------------/ /-----/
scheme                authority                      path
那么有意思的东西来了,呵呵
Android会去l中去寻一个authority
(le.provider.NotePad)的provider
AndroidDemo中的NotePad实例中此provider的定义如下
[xhtml]view plaincopy
1.<provider android:name="NotePadProvider"
2.    android:authorities="le.provider.NotePad"
3./>
2.到这个实际上名为NotePadProvider的provider后,Android会怎么做?
大家看看NotePadProvider.java这个文件,呵呵名字一样一样的啊。
看看里面的这个方法
[java]view plaincopy
1.@Override
2.public String getType(Uri uri) {
3.    switch (sUriMatcher.match(uri)) {
4.    case NOTES:
5.    case LIVE_FOLDER_NOTES:
6.        return Notes.CONTENT_TYPE;
7.
8.    case NOTE_ID:
9.        return Notes.CONTENT_ITEM_TYPE;
10.
11.    default:
12.        throw new IllegalArgumentException("Unknown URI " + uri
)
;
13.    }
14.}
系统在到NotePadProvider.java这个类后会调用这个类中的getType方法,来获得mimeType。
所有的provider都会实现getType()方法。
看看这段代码都做了什么?哦,no。它又做了一些事情,sUriMatcher.match(uri)这个函数会把 content://le.provider.NotePad/notes中的path部分(notes)取出来,然后根据取得的内容(notes)
返回所获得的mimeType。
哦,明白了!匹配么,大家都知道呗。那么sUriMatcher是如何设置的呢?看下列代码:
[java]view plaincopy
1.private static final int NOTES = 1;
2.private static final int NOTE_ID = 2;
3.private static final int LIVE_FOLDER_NOTES = 3;
4.UriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
5.    sUriMatcher.addURI(NotePad.AUTHORITY, "notes", NOTES);
6.    sUriMatcher.addURI(NotePad.AUTHORITY, "notes/#", NOTE_ID);
7.    sUriMatcher.addURI(NotePad.AUTHORITY, "live_folders/notes",
LIVE_FOLDER_NOTES);
哦,这回明白了,我们上一步获取到的path部分(notes)会与NOTES匹配上去,然后getType会返回Notes.CONTENT_TYPE 这种类型,哎,绕了一圈,最后得到这个mimeType后我们还是不知道这个会导向哪个Activity啊。
别着急,十万里长征,最后一得瑟啊。
先看看Notes.CONTENT_TYPE这个里面是怎么定义的。
[java]view plaincopy
1./**
2. * The MIME type of {@link #CONTENT_URI} providing a directory
of notes.
3. */
4.public static final String CONTENT_TYPE = "vnd.android.cursor.d
le.note";
5.
6./**
7. * The MIME type of a {@link #CONTENT_URI} sub-directory of a s
ingle note.
8. */
9.public static final String CONTENT_ITEM_TYPE = "vnd.android.cur
sor.le.note";
哈哈,功夫不负有心人啊,看看这个
"vnd.android.cursor.le.note"这个值怎么看着这么眼熟呢。我们
回到工程下的l里面去看看到底哪个Activity的里面data 的类型定义成这个啦。
[java:showcolumns]view plaincopy .........10........20........30........40........50........60........70........80........90........140. (150)
1.<data android:mimeType="vnd.android.cursor.le.note
" />
这个。。我们悲剧的发现3个Activity里面居然都有。。。。。无语了!
悲愤30s。。接着3个Activity分别是NotesList,NoteEditor,TitleEditor。*****,好像NotePad这个应用也就这么几个Activity吧。
回到从前看看new Intent(*,*)的第一个参数Acntion啊。
Intent.ACTION_INSERT,到了。他的真面目是
"android.intent.action.INSERT"
[java]view plaincopy
1.<intent-filter>
2.    <action android:name="android.intent.action.INSERT" />
3.    <category android:name="android.intent.category.DEFAULT" />
4.    <data android:mimeType="vnd.android.cursor.le.n
ote" />
5.</intent-filter>
所有的intent-filter标签内容,只有NoteEditor这个Activity一个符合<action android:name>和
<data android:mimeType>内容都符合之前我们到的粉字体。
跋山涉水啊,千山万雨啊,我们个了这个最后交NoteEditon的这个Activity 了啊。
原来Android设计的这种Intent隐式调用使用的是action与data的mimeType 共同导向Activity的,等等,你说cateory这个干什么用的?哦。。既然2个条件导向可以,那么多加一个我想我们程序员也是可以接受的吧。
当然我们自己用设置成Default就可以了。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。