安卓开发实例一Word格式.docx
- 文档编号:19191009
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:8
- 大小:127.86KB
安卓开发实例一Word格式.docx
《安卓开发实例一Word格式.docx》由会员分享,可在线阅读,更多相关《安卓开发实例一Word格式.docx(8页珍藏版)》请在冰豆网上搜索。
就从入口点所在的activity(见图1)开始,可以看到这个activity最重要的功能就是显示日志列表。
这个程序的日志都存放在Sqlite数据库中,因此需要读取出所有的日志记录并显示。
先来看两个重要的私有数据,第一个PROJECTION字段指明了“日志列表“所关注的数据库中的字段(即只需要ID和Title就可以了)。
private
static
final
String[]
PROJECTION
=
new
{
Notes._ID,
//
Notes.TITLE,
1
};
第二个字段COLUMN_INDEX_TITLE指明title字段在数据表中的索引。
int
COLUMN_INDEX_TITLE
1;
然后就进入第一个调用的函数onCreate。
Intent
intent
getIntent();
if
(intent.getData()
==
null)
intent.setData(Notes.CONTENT_URI);
}
因为NotesList这个activity是系统调用的,此时的intent是不带数据和操作类型的,系统只是在其中指明了目标组件是Notelist,所以这里把”content:
//.google.provider.NotePad/notes”保存到intent里面,这个URI地址指明了数据库中的数据表名(参见以后的NotePadProvider类),也就是保存日志的数据表notes。
Cursor
cursor
managedQuery(getIntent().getData(),
PROJECTION,
null,
Notes.DEFAULT_SORT_ORDER);
然后调用managedQuery函数查询出所有的日志信息,这里第一个参数就是上面设置的”content:
//.google.provider.NotePad/notes”这个URI,即notes数据表。
PROJECTION字段指明了结果中所需要的字段,Notes.DEFAULT_SORT_ORDER指明了结果的排序规则。
实际上managedQuery并没有直接去查询数据库,而是通过ContentProvider来完成实际的数据库操作,这样就实现了逻辑层和数据库层的分离。
SimpleCursorAdapter
adapter
SimpleCursorAdapter(this,
R.layout.noteslist_item,
cursor,
{
Notes.TITLE
},
int[]
android.R.id.text1
});
setListAdapter(adapter);
查询出日志列表后,构造一个CursorAdapter,并将其作为ListView的数据源,从而在界面上显示出日志列表。
可以看到,第二个参数是R.layout.noteslist_item,打开对应的noteslist_item.xml文件,
TextView
xmlns:
android="
schemas.android./apk/res/android"
id="
id/text1"
layout_width="
fill_parent"
layout_height="
?
attr/listPreferredItemHeight"
textAppearance="
attr/textAppearanceLarge"
gravity="
center_vertical"
paddingLeft="
5dip"
singleLine="
true"
就是用来显示一条日志记录的TextView,最后两个字段指明了实际的字段映射关系,通过这个TextView来显示一条日志记录的title字段。
处理“选择日志”事件
既然有了“日志列表”,就自然要考虑如何处理某一条日志的单击事件,这通过重载onListItemClick方法来完成,
Override
protected
void
onListItemClick(ListView
l,
View
v,
position,
long
id)
Uri
uri
ContentUris.withAppendedId(getIntent().getData(),
id);
String
getIntent().getAction();
(Intent.ACTION_PICK.equals(action)
||
Intent.ACTION_GET_CONTENT.equals(action))
The
caller
is
waiting
for
us
to
return
a
note
selected
by
the
user.
have
clicked
on
one,
so
it
now.
setResult(RESULT_OK,
Intent().setData(uri));
}
else
Launch
activity
view/edit
currently
item
startActivity(new
Intent(Intent.ACTION_EDIT,
uri));
首先通过”content:
//.google.provider.NotePad/notes”和日志的id号拼接得到选中日志的真正URI,然后创建一个新的Intent,其操作类型为Intent.ACTION_EDIT,数据域指出待编辑的日志URI(这里只分析else块)。
Intent深度剖析
那么,上面这句startActivity(newIntent(Intent.ACTION_EDIT,uri))执行后会发生什么事情呢?
这时候Android系统就跳出来接管了,它会根据intent中的信息找到对应的activity,在这里找到的是NoteEditor这个activity,然后创建这个activity的实例并运行。
那么,Android又是如何找到NoteEditor这个对应的activity的呢?
这就是intent发挥作用的时刻了。
uri)
这里的Intent.ACTION_EDIT=”android.intent.action.EDIT”,另外通过设置断点,我们看下这里的uri值:
可以看到选中的日志条目的URI是:
content:
//.google.provider.NotePad/notes/1。
然后我们再来看下Androidmanfest.xml,其中有这个provider
provider
NotePadProvider"
authorities="
.google.provider.NotePad"
发现没有?
它也有com.google.provider.NotePad,这个是content:
//.google.provider.NotePad/notes/1的一部分,同时
NoteEditor"
theme="
style/Theme.Light"
label="
string/title_note"
screenOrientation="
sensor"
configChanges="
keyboardHidden|orientation"
>
!
--
This
filter
says
that
we
can
view
or
edit
data
of
single
-->
intent-filter
string/resolve_edit"
android.intent.action.VIEW"
android.intent.action.EDIT"
.android.notepad.action.EDIT_NOTE"
android.intent.category.DEFAULT"
mimeType="
vnd.android.cursor.item/vnd.google.note"
create
inside
of
directory
notes.
android.intent.action.INSERT"
vnd.android.cursor.dir/vnd.google.note"
/activity>
上面第一个intent-filter中有一个action名为android.intent.action.EDIT,而前面我们创建的Intent也正好是Intent.ACTION_EDIT=”android.intent.action.EDIT”,想必大家已经明白是怎么回事了吧。
下面就进入activity选择机制了:
系统从intent中获取道uri,得到了content:
//.google.provider.NotePad/notes/1,去掉开始的content:
标识,得到com.google.provider.NotePad/notes/1,然后获取前面的com.google.provider.NotePad,然后就到Androidmanfest.xml中找到authorities为com.google.provider.NotePad的provider,这个就是后面要讲的contentprovider,然后就加载这个contentprovider。
在这里是NotePadProvider,然后调用NotePadProvider的gettype函数,并把上述URI传给这个函数,函数返回URI所对应的类型(这里返回Notes.CONTENT_ITEM_TYPE,代表一条日志记录,而CONTENT_ITEM_TYPE="
vnd.android.cursor.item/vnd.google.note"
)。
public
getType(Uri
uri)
switch
(sUriMatcher.match(uri))
case
NOTES:
Notes.CONTENT_TYPE;
NOTE_ID:
Notes.CONTENT_ITEM_TYPE;
default:
throw
IllegalArgumentException("
Unknown
URI
"
+
uri);
上面的sUriMatcher.match是用来检测uri是否能够被处理,而sUriMatcher.match(uri)返回值其实是由决定的。
sUriMatcher
UriMatcher(UriMatcher.NO_MATCH);
sUriMatcher.addURI(NotePad.AUTHORITY,
notes"
NOTES);
notes/#"
NOTE_ID);
然后系统使用获得的"
和”android.intent.action.EDIT”到androidmanfest.xml中去找匹配的activity.
正好NoteEditor这个activity的intent-filter满足上述条件,这样就找到了NoteEditor。
于是系统加载这个类并实例化,运行,然后就到了NoteEditor的OnCreate函数中(见后续文章)。
小技巧
1,在命令行中使用”adbshell”命令进入系统中,然后”cdapp”进入应用程序所在目录,”rmXXX”就可以删除你指定的apk,从而去掉其在系统顶层界面占据的图标,若两次”cddata”则可以进入应用程序使用的数据目录,你的数据可以保存在这里,例如Notepad就是把其数据库放在它的databases目录下,名为note_pad.db.
2,第一次启动模拟器会比较慢,但以后就别关闭模拟器了,修改代码,调试都不需要再次启动的,直接修改后run或debug就是。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 开发 实例