首页>
知识库>
详情

Android实例剖析笔记(一)

2020-07-28 来源:CloudBest 阅读量: 0
关键词:

    开卷语
    俗话说,“熟读唐诗三百首,不会作诗也会吟”。最近收集了很多Android的示例代码,从这些代码的阅读和实验中学习到很多知识,从而产生写这个系列的打算,目标就是一步步跟着实例进行动手实作,真正从“做”中体会和学习Android开发。
    本文是这个系列的第一篇,目标是Android自带的一个范例程序:记事本,将分为四篇文章进行详细介绍。
    预备知识
    搭建开发环境,尝试编写”Hello World”,了解Android的基本概念,熟悉Android的API(官方文档中都有,不赘述)。

    程序入口点
    类似于win32程序里的WinMain函数,Android自然也有它的程序入口点。它通过在AndroidManifest.xml文件中配置来指明,可以看到名为NotesList的activity节点下有这样一个intent-filter,其action为android.intent.action.MAIN, Category指定为 android.intent.category.LAUNCHER,这就指明了这个activity是作为入口activity,系统查找到它后,就会创建这个activity实例来运行,若未发现就不启动(你可以把MAIN改名字试试)。
    <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    NotesList详解
    就从入口点所在的activity(见图1)开始,可以看到这个activity最重要的功能就是显示日志列表。这个程序的日志都存放在Sqlite数据库中,因此需要读取出所有的日志记录并显示。先来看两个重要的私有数据,第一个PROJECTION字段指明了"日志列表"所关注的数据库中的字段(即只需要ID和Title就可以了)。
    private static final String[] PROJECTION = new String[] {
    Notes._ID, // 0
    Notes.TITLE, // 1
    };
    第二个字段COLUMN_INDEX_TITLE指明title字段在数据表中的索引。
    private static final int COLUMN_INDEX_TITLE = 1;
    然后就进入第一个调用的函数onCreate。
    Intent intent = getIntent();
    if (intent.getData() == null)
    {
    intent.setData(Notes.CONTENT_URI);
    }
    因为NotesList这个activity是系统调用的,此时的intent是不带数据和操作类型的,系统只是在其中指明了目标组件是Notelist,所以这里把"content:// com.google.provider.NotePad/notes"保存到intent里面,这个URI地址指明了数据库中的数据表名(参见以后的NotePadProvider类),也就是保存日志的数据表notes。[nextpage]
    Cursor cursor = managedQuery(getIntent()。getData(), PROJECTION, null, null, Notes.DEFAULT_SORT_ORDER);
    然后调用managedQuery函数查询出所有的日志信息,这里第一个参数就是上面设置的" content:// com.google.provider.NotePad/notes"这个URI,即notes数据表。PROJECTION 字段指明了结果中所需要的字段,Notes.DEFAULT_SORT_ORDER 指明了结果的排序规则。实际上managedQuery并没有直接去查询数据库,而是通过Content Provider来完成实际的数据库操作,这样就实现了逻辑层和数据库层的分离。
    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.noteslist_item, cursor,
    new String[] { Notes.TITLE }, new int[] { android.R.id.text1 });
    setListAdapter(adapter);
    查询出日志列表后,构造一个CursorAdapter,并将其作为List View的数据源,从而在界面上显示出日志列表。可以看到,第二个参数是R.layout.noteslist_item,打开对应的noteslist_item.xml文件,
    <TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    android:layout_width="fill_parent"
    android:layout_height="?android:attr/listPreferredItemHeight"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:gravity="center_vertical"
    android:paddingLeft="5dip"
    android:singleLine="true"
    />
    就是用来显示一条日志记录的TextView,最后两个字段指明了实际的字段映射关系,通过这个TextView来显示一条日志记录的title字段。