ContentProvider简单使用(读取系统联系人并展示到简单的ListView控件上),读取以及创建属于自己的内容提供器

ContentProvider一般用法有两种:一种是使用现有的ContentProvider读取和操作相应程序中的数据:
 * 另一种是创建自己的ContentProvider,给程序的数据提供外部访问接口
 *
 * 如果想要访问ContentProvider中共享的数据,就要借助ContentResolver类
 * 可以通过Context中的getContentResolver()获取该类的实例
 * ContentResolver中提供了update() delete() query() insert()方法用于增删改查
 *
 * 不同于SQLiteDatabase,ContentProvider中的增删改查都是不接收表名参数的,而是使用了一个Uri参数代替,
 * 这个参数成为内容URI。内容URI给ContentProvider中的数据建立了唯一标识符,主要有两部分组成,authority和path。
 * authority是用于对不同应用程序做区分的,一般采用包名进行命名。比如某程序包名为com.example.app,
 * 那么该应用的authority可以命名为com.example.app.privider。
 * path用于对同一应用程序中不同的表做区分的,通常添加到authority后面,比如某个应用数据库中存在两张表table1 table2
 * 这时可以将path分别命名为/table1 /table2,然后将authority和path进行组合,内容URI就变成了
 * com.example.app.provider/table1不过目前还是很难认出这个字符串是内容URI,所以还要在头部加上协议声明:
 * content://com.example.app.provider/table1  得到URI字符串后还需要解析成Uri对象才可以作为参数传入,解析方法如下
 * val uri = Uri.parse("content://com.example.app.provider/table1")
 * 现在就可以使用Uri对象查询table1表中的数据了,代码示例如下
 * val crusor = contentResolver.query(uri,projection,selection,selectionArgs,sortOrder)
 * 查询返回的是一个Cursor对象,这个时候就可以将数据从Cursor对象中逐个读取出来了,示例如下
 * while(cursor.moveToNext()){
 *   val column1 = cursor.getString(cursor.getColumnIndex("column1"))
 *   val column2 = cursor.getString(cursor.getColumnIndex("column2"))
 * }
 * cursor.close()
 *
 * 添加数据
 * val values = contentValuesOf("column1" to "text","column2" to "1)
 * contentResolver.insert(uri,values)
 * 更新数据,例如将值清空
 * val values = contentValuesOf("column1" to ""* contentResolver.update(uri,values,"column1 = ? and column2 = ?,arrayOf("text","1"))
 * 上述代码使用了selection和selectionArgs参数来对想要更新的数据进行约束,防止所有的行都受影响
 * 删除数据
 * contentResolver.delete(uri,"column2 = ?",arrayOf("1")

读取系统联系人并展示到简单的ListView控件上,不要忘了AndroidManifest.xml的权限声明

package com.example.contactstest

import android.annotation.SuppressLint
import android.content.pm.PackageManager
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.provider.ContactsContract
import android.widget.Adapter
import android.widget.ArrayAdapter
import android.widget.ListView
import android.widget.Toast
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat

class MainActivity : AppCompatActivity() {

    private val contactsList = ArrayList<String>()
    private lateinit var adapter: ArrayAdapter<String>

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val contactsView : ListView = findViewById(R.id.contactsView)

        adapter = ArrayAdapter(this,android.R.layout.simple_list_item_1,contactsList)
        contactsView.adapter = adapter
        if (ContextCompat.checkSelfPermission(this,android.Manifest.permission.READ_CONTACTS)
        != PackageManager.PERMISSION_GRANTED){
            ActivityCompat.requestPermissions(this,
            arrayOf(android.Manifest.permission.READ_CONTACTS),1)
        }else{
            readContacts()
        }
    }

    override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<out String>,
        grantResults: IntArray
    ) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        when(requestCode){
            1 -> {
                if (grantResults.isNotEmpty() &&
                        grantResults[0] == PackageManager.PERMISSION_GRANTED){
                    readContacts()
                }else{
                    Toast.makeText(this,"You denied the permission",
                    Toast.LENGTH_SHORT).show()
                }
            }
        }
    }

    @SuppressLint("Range")
    private fun readContacts(){
        /查询联系人数据
        contentResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
        null,null,null,null)?.apply {
            while (moveToNext()){
                /获取联系人姓名
                val displayName = getString(getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME))
                /获取联系人手机号
                val number = getString(getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER))
                contactsList.add("$displayName\n$number")
            }
            adapter.notifyDataSetChanged()
            close()
        }
    }
}

创建内容提供器

package com.example.databasetest

import android.content.ContentProvider
import android.content.ContentValues
import android.content.UriMatcher
import android.database.Cursor
import android.net.Uri

class DatabaseProvider : ContentProvider() {

    private val bookDir = 0
    private val bookItem = 1
    private val categoryDir = 2
    private val categoryItem = 3
    private val authority = "com.example.databasetest.provider"
    private var dbHelper : MyDatabaseHelper? = null

    /by lazy代码块是一种懒加载技术,一开始不执行,只有首次调用uriMatcher变量才会执行,并且将代码块最后一行的值返回
    private val uriMacher by lazy {
        val matcher = UriMatcher(UriMatcher.NO_MATCH)
        matcher.addURI(authority,"book",bookDir)
        matcher.addURI(authority,"book/#",bookItem)
        matcher.addURI(authority,"category",categoryDir)
        matcher.addURI(authority,"category/#",categoryItem)
        matcher
    }

    override fun delete(uri: Uri, selection: String?, selectionArgs: Array<String>?) = dbHelper?.let {
        /删除数据
        val db = it.writableDatabase
        val deletedRows = when(uriMacher.match(uri)){
            bookDir -> db.delete("Book",selection,selectionArgs)
            bookItem -> {
                val bookId = uri.pathSegments[1]
                db.delete("Book","id = ?", arrayOf(bookId))
            }
            categoryItem -> {
                val categoryId = uri.pathSegments[1]
                db.delete("Category","id = ?", arrayOf(categoryId))
            }
            categoryDir -> db.delete("Category",selection,selectionArgs)
            else ->0
        }
        deletedRows
    }?:0

    override fun getType(uri: Uri) = when(uriMacher.match(uri)){
        bookItem -> "vnd.android.cursor.item/vnd.com.example.databasetest.provider.book"
        bookDir -> "vnd.android.cursor.dir/vnd.com.example.databasetest.provider.book"
        categoryDir -> "vnd.android.cursor.dir/vnd.com.example.databasetest.provider.category"
        categoryItem -> "vnd.android.cursor.item/vnd.com.example.databasetest.provider.category"
        else -> null
    }

    override fun insert(uri: Uri, values: ContentValues?) = dbHelper?.let {
        /添加数据
        val db = it.writableDatabase
        val uriReturn = when(uriMacher.match(uri)){
            bookItem,bookDir -> {
                val newBookId = db.insert("Book",null,values)
                Uri.parse("content://$authority/book/$newBookId")
            }
            categoryItem,categoryDir -> {
                val newCategoryId = db.insert("Category",null,values)
                Uri.parse("content://$authority/category/$newCategoryId")
            }
            else -> null
        }
        uriReturn
    }

    override fun onCreate() = context?.let {
        dbHelper =  MyDatabaseHelper(it,"BookStore.db",2)
        true
    }?:false

    /Uri对象的getpathSegments:会将内容URI权限之后的部分以“/”进行分割,并将分割结果放入字符串,那么0存的是路径,1存的是id
    override fun query(
        uri: Uri, projection: Array<String>?, selection: String?,
        selectionArgs: Array<String>?, sortOrder: String?) = dbHelper?.let {
            /查询数据
            val db = it.readableDatabase
        val cursor = when(uriMacher.match(uri)){
            bookDir -> db.query("Book",projection,selection,selectionArgs,null,null,sortOrder)
            bookItem -> {
                val bookId = uri.pathSegments[1]
                db.query("Book",projection,"id = ?", arrayOf(bookId),null,null,sortOrder)}
            categoryDir -> db.query("Category",projection,selection,selectionArgs,null,null,sortOrder)
            categoryItem -> {
                val categoryId = uri.pathSegments[1]
                db.query("Category",projection,"id = ?", arrayOf(categoryId),null,null,sortOrder)}
            else -> null
        }
        cursor
    }

    override fun update(
        uri: Uri, values: ContentValues?, selection: String?,
        selectionArgs: Array<String>?
    ) = dbHelper?.let {
        val db = it.writableDatabase
        val updateRows = when(uriMacher.match(uri)){
            bookDir -> db.update("Book",values,selection,selectionArgs)
            bookItem -> {
                val bookId = uri.pathSegments[1]
                db.update("Book",values,"id = ?", arrayOf(bookId))
            }
            categoryDir -> db.update("Category",values,selection,selectionArgs)
            categoryItem -> {
                val categoryId = uri.pathSegments[1]
                db.update("Category",values,"id = ?", arrayOf(categoryId))
            }
            else -> null
        }
        updateRows
    }?:0
}

读取内容提供器中的内容

package com.example.providertest

import android.annotation.SuppressLint
import android.net.Uri
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.Button
import androidx.core.content.contentValuesOf

class MainActivity : AppCompatActivity() {
    private var bookId : String? = null

    @SuppressLint("Range")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val query : Button = findViewById(R.id.queryData)
        val update : Button = findViewById(R.id.updateData)
        val delete : Button = findViewById(R.id.deleteData)
        val insert : Button = findViewById(R.id.insertData)

        insert.setOnClickListener {
            /添加数据
            val uri = Uri.parse("content://com.example.databasetest.provider/book")
            val values = contentValuesOf("name" to "A Clash of Kings",
            "author" to "George Martin","pages" to 1000,"price" to 22.33)
            val newUri = contentResolver.insert(uri,values)
            bookId = newUri?.pathSegments?.get(1)
        }

        query.setOnClickListener {
            /查询数据
            val uri = Uri.parse("content://com.example.databasetest.provider/book")
            contentResolver.query(uri,null,null,null,null)?.apply {
                while (moveToNext()){
                    val name = getString(getColumnIndex("name"))
                    val author = getString(getColumnIndex("author"))
                    val pages = getString(getColumnIndex("pages"))
                    val price = getString(getColumnIndex("price"))
                    Log.d("MainActivity","book name is $name")
                    Log.d("MainActivity","book author is $author")
                    Log.d("MainActivity","book pages is $pages")
                    Log.d("MainActivity","book price is $price")
                }
                close()
            }
        }

        update.setOnClickListener {
            /更新数据
            bookId?.let {
                val uri = Uri.parse("content://com.example.databasetest.provider/book/$it")
                val values = contentValuesOf("name" to "A Storm of Swords",
                "pages" to 1226,"price" to 24.33)
                contentResolver.update(uri,values,null,null)
            }
        }

        delete.setOnClickListener {
            /删除数据
            bookId?.let {
                val uri = Uri.parse("content://com.example.databasetest.provider/book/$it")
                contentResolver.delete(uri,null,null)
            }
        }
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第1章 Android应用与开发环境 1 1.1 Android的发展和历史 2 1.1.1 Android的发展和简介 2 1.1.2 Android平台架构及特性 3 1.2 搭建Android开发环境 5 1.2.1 下载和安装Android SDK 5 1.2.2 安装Eclipse和ADT插件 7 1.3 Android常用开发工具的用法 10 1.3.1 创建、删除和浏览AVD 10 1.3.2 使用Android模拟 (Emulator) 14 1.3.3 使用DDMS进行调试 15 1.3.4 Android Debug Bridge(ADB) 的用法 16 1.3.5 使用DX编译Android应用 18 1.3.6 使用Android Asset Packaging Tool(AAPT)打包资源 19 1.3.7 使用mksdcard管理虚拟SD卡 19 1.4 开始第一个Android应用 20 1.4.1 使用Eclipse开发第一个 Android应用 20 1.4.2 通过ADT运行Android应用 23 1.5 Android应用结构分析 24 1.5.1 创建一个Android应用 24 1.5.2 自动生成的R.java 26 1.5.3 res目录说明 27 1.5.4 Android应用的清单文件: AndroidManifest.xml 28 1.5.5 应用程序权限说明 29 1.6 Android应用的基本组件 介绍 31 1.6.1 Activity和View 31 1.6.2 Service 32 1.6.3 BroadcastReceiver 32 1.6.4 ContentProvider 32 1.6.5 Intent和IntentFilter 33 1.7 本章小结 33 第2章 Android应用的界面编程 35 2.1 界面编程与视图(View)组件 36 2.1.1 视图组件与容组件 36 2.1.2 使用XML布局文件控制UI 界面 40 2.1.3 在代码中控制UI界面 41 2.1.4 使用XML布局文件和Java 代码混合控制UI界面 42 2.1.5 开发自定义View 43 2.2 布局管理 46 2.2.1 线性布局 47 2.2.2 表格布局 49 2.2.3 帧布局 52 2.2.4 相对布局 55 2.2.5 绝对布局 58 2.3 基本界面组件 60 2.3.1 文本框(TextView)与编辑框 (EditText)的功能和用法 60 2.3.2 按钮(Button)与图片按钮(ImageButton)组件的功能和 用法 66 2.3.3 使用9Patch图片作为按钮背景 68 2.3.4 单选按钮(RadioButton)和复选 框(CheckBox)介绍与应用 69 2.3.5 状态开关按钮(ToggleButton) 的功能与用法 71 2.3.6 时钟(AnalogClock和Digital Clock)的功能与功法 73 2.3.7 图像视图(ImageView)的 功能和用法 75 2.4 高级界面组件 79 2.4.1 自动完成文本框(AutoCompleteTextView)的 功能和用法 79 2.4.2 Spinner的功能和用法 80 2.4.3 日期、时间选择(DatePicker 和TimePicker)的功能和用法 83 2.4.4 进度条(ProgressBar)的 功能和用法 85 2.4.5 拖动条(SeekBar)的功能和 用法 90 2.4.6 星级评分条(RatingBar) 的 功能和用法 91 2.4.7 选项卡(TabHost)的功能和 用法 93 2.4.8 滚动视图(ScrollView) 的 功能和用法 95 2.4.9 列表视图(ListView和 ListActivity) 95 2.4.10 可展开的列表组件(ExpandableListView) 101 2.4.11 网格视图(GridView)和 图像切换(ImageSwitcher) 功能和用法 104 2.4.12 画廊视图(Gallery)的功能和 用法 107 2.5 对话框 110 2.5.1 使用AlertDialog创建简单 对话框 110 2.5.2 使用AlertDialog创建列表 对话框 112 2.5.3 使用AlertDialog创建自定义 对话框 116 2.5.4 使用PopupWindow 121 2.5.5 使用DatePickerDialog、TimePickerDialog 123 2.5.6 使用ProgressDialog创建进度 对话框 125 2.6 消息提示 127 2.6.1 使用Toast显示提示信息框 128 2.6.2 Notification的功能与用法 129 2.7 菜单 132 2.7.1 选项菜单和子菜单 (SubMenu) 132 2.7.2 使用监听来监听菜单事件 136 2.7.3 创建复选菜单项和单选菜单项 137 2.7.4 设置与菜单项关联的Activity 140 2.7.5 上下文菜单 141 2.8 本章小结 143 第3章 事件处理 144 3.1 Android的事件处理 145 3.2 基于监听的事件处理 145 3.2.1 事件监听的处理模型 145 3.2.2 事件和事件监听 148 3.2.3 内部类作为事件监听类 151 3.2.4 外部类作为事件监听类 152 3.2.5 Activity本身作为事件监听 153 3.2.6 匿名内部类作为事件监听类 154 3.2.7 直接绑定到标签 155 3.3 基于回调的事件处理 156 3.3.1 回调机制与监听机制 156 3.3.2 基于回调的事件传播 158 3.3.3 重写onTouchEvent方法响应 触摸屏事件 160 3.4 响应的系统设置的事件 162 3.4.1 Configuration类简介 162 3.4.2 重写onConfigurationChanged 响应系统设置更改 164 3.5 Handler消息传递机制 166 3.5.1 Handler类简介 166 3.5.2 Handler使用案例 167 3.6 本章小结 168 第4章 深入理解Activity 169 4.1 建立、配置和使用Activity 170 4.1.1 建立Activity 170 4.1.2 配置Activity 177 4.1.3 启动、关闭Activity 179 4.1.4 使用Bundle在Activity之间 交换数据 181 4.1.5 启动其他Activity并返回结果 185 4.2 Activity的回调机制 189 4.3 Activity的生命周期 190 4.3.1 Activity的生命周期演示 190 4.3.2 Activity与Servlet的相似性与 区别 194 4.4 本章小结 195 第5章 使用Intent和IntentFilter 第5章 进行通信 196 5.1 Intent对象详解 197 5.1.1 使用Intent启动系统组件 197 5.2 Intent的属性及intent-filter 配置 198 5.2.1 Component属性 198 5.2.2 Action、Category属性与 intent-filter配置 200 5.2.3 指定Action、Category调用 系统Activity 204 5.2.4 Data、Type属性与intent-filter 配置 209 5.2.5 Extra属性 211 5.3 使用Intent创建Tab页面 211 5.4 本章小结 212 第6章 Android应用的资源 213 6.1 资源的类型及存储方式 214 6.1.1 资源的类型以及存储方式 214 6.1.2 使用资源 216 6.2 使用字符串、颜色、 尺寸资源 217 6.2.1 颜色值的定义 217 6.2.2 定义字符串、颜色、尺寸资源 文件 218 6.2.3 使用字符串、颜色、 尺寸资源 219 6.3 数组(Array)资源 222 6.4 使用(Drawable)资源 225 6.4.1 图片资源 225 6.4.2 StateListDrawable资源 225 6.4.3 LayerDrawable资源 227 6.4.4 ShapeDrawable资源 229 6.4.5 ClipDrawable资源 231 6.4.6 AnimationDrawable资源 233 6.5 使用原始XML资源 236 6.5.1 定义原始XML资源 236 6.5.2 使用原始XML文件 237 6.6 使用布局(Layout)资源 239 6.7 使用菜单(Menu)资源 239 6.7.1 定义菜单资源 239 6.7.2 使用菜单资源 240 6.8 样式(Style)和主题(Theme) 资源 243 6.8.1 样式资源 243 6.8.2 主题资源 245 6.9 属性(Attribute)资源 247 6.10 使用原始资源 249 6.11 国际化和资源自适应 251 6.11.1 Java国际化的思路 252 6.11.2 Java支持的语言和国家 252 6.11.3 完成程序国际化 253 6.11.4 为Android应用提供国际化 资源 255 6.11.5 国际化Android应用 256 6.12 本章小结 258 第7章 图形与图像处理 259 7.1 使用简单图片 260 7.1.1 使用Drawable对象 260 7.1.2 Bitmap和BitmapFactory 260 7.2 绘图 263 7.2.1 Android绘图基础:Canvas、 Paint等 263 7.2.2 Path类 267 7.2.3 绘制游戏动画 270 7.3 图形特效处理 278 7.3.1 使用Matrix控制变换 278 7.3.2 使用drawBitmapMesh扭曲 图像 282 7.3.3 使用Shader填充图形 285 7.4 逐帧(Frame)动画 288 7.4.1 AnimationDrawable与逐帧 动画 288 7.5 补间(Tween)动画 292 7.5.1 Tween动画与Interpolator 292 7.5.2 位置、大小、旋转度、透明度 改变的补间动画 293 7.5.3 自定义补间动画 298 7.6 使用SurfaceView实现动画 300 7.6.1 SurfaceView的绘图机制 301 7.7 本章小结 305 第8章 Android的数据存储和IO 306 8.1 使用SharedPreferences 307 8.1.1 SharedPreferences与Editor 简介 307 8.1.2 SharedPreferences的存储 位置和格式 308 8.1.3 读、写其他应用Shared Preferences 310 8.2 File存储 311 8.2.1 openFileOutput和open FileInput 312 8.2.2 读写SD卡上的文件 314 8.3 SQLite数据库 321 8.3.1 简介SQLiteDatabase 321 8.3.2 创建数据库和表 323 8.3.3 使用SQL语句操作SQLite 数据库 323 8.3.4 使用sqlite3工具 325 8.3.5 使用特定方法操作SQLite 数据库 327 8.3.6 事务 329 8.3.7 SQLiteOpenHelper类 330 8.4 手势(Gesture) 335 8.4.1 手势检测 335 8.4.2 增加手势 342 8.4.3 识别用户的手势 346 8.5 自动朗读(TTS) 347 8.6 本章小结 350 第9章 使用ContentProvider实现 第9章 数据共享 351 9.1 数据共享标准: ContentProvider简介 352 9.1.1 ContentProvider简介 352 9.1.2 Uri简介 353 9.1.3 使用ContentResolver操作 数据 354 9.2 操作系统ContentProvider 355 9.2.1 使用ContentProvider管理 联系人 355 9.2.2 使用ContentProvider管理 多媒体内容 360 9.3 实现ContentProvider 364 9.3.1 创建ContentProvider的步骤 364 9.4 监听ContentProvider的数据 改变 370 9.4.1 ContentObserver简介 370 9.5 本章小结 372 第10章 Service与Broadcast 第10章 Receiver 373 10.1 Service简介 374 10.1.1 创建、配置Service 374 10.1.2 启动和停止Service 376 10.1.3 绑定本地Service并与之 通信 377 10.1.4 Service的生命周期 381 10.2 跨进程调用Service (AIDL服务) 382 10.2.1 AIDL服务简介 382 10.2.2 创建AIDL文件 383 10.2.3 将接口暴露给客户端 383 10.2.4 客户端访问AIDLService 385 10.3 电话管理 (TelephonyManager) 393 10.4 短信管理(SmsManager) 400 10.5 音频管理 (AudioManager) 404 10.5.1 AudioManager简介 404 10.6 振动(Vibrator) 407 10.6.1 Vibrator简介 407 10.6.2 使用Vibrator控制手机振动 407 10.7 手机闹钟服务 (AlarmManager) 408 10.7.1 AlarmManager简介 408 10.7.2 设置闹钟 409 10.8 接收广播消息 413 10.8.1 BroadcastReceiver简介 413 10.8.2 发送广播 414 10.8.3 有序广播 416 10.9 接收系统广播消息 424 10.10 本章小结 427 第11章 多媒体应用开发 428 11.1 音频和视频的播放 429 11.1.1 使用MediaPlayer播放音频 429 11.1.2 使用SoundPool播放音效 432 11.1.3 使用VideoView播放视频 435 11.1.4 使用MediaPlayer和 SurfaceView播放视频 436 11.2 使用MediaRecorder录制 音频 439 11.3 控制摄像头拍照 442 11.3.1 通过Camera进行拍照 442 11.3.2 录制视频短片 446 11.4 本章小结 450 第12章 OpenGL与3D应用开发 451 12.1 3D图像与3D开发的 基本知识 452 12.2 OpenGL和OpenGL ES简介 453 12.3 绘制2D图形 454 12.3.1 在Android应用中使用 OpenGL ES 454 12.3.2 绘制平面上的多边形 457 12.3.3 旋转 463 12.4 绘制3D图形 465 12.4.1 构建3D图形 465 12.4.2 应用纹理贴图 469 12.5 本章小结 475 第13章 Android的网络应用 476 13.1 基于TCP协议的网络通信 477 13.1.1 TCP协议基础 477 13.1.2 使用ServerSocket创建TCP 服务端 478 13.1.3 使用Socket进行通信 479 13.1.4 加入多线程 483 13.2 使用URL访问网络资源 489 13.2.1 使用URL读取网络资源 489 13.2.2 使用URLConnection提交 请求 491 13.3 使用HTTP访问网络 496 13.3.1 使用HttpURLConnection 496 13.3.2 使用Apache HttpClient 501 13.4 使用WebView视图显示 网页 506 13.4.1 使用WebView浏览网页 506 13.4.2 使用WebView加载HTML 代码 507 13.5 使用Web Service进行网络 编程 508 13.5.1 Web Service简介 509 13.5.2 Web Service平台概述 510 13.5.3 使用Android应用调用 Web Service 512 13.6 本章小结 524 第14章 管理Android手机桌面 525 14.1 管理手机桌面 526 14.1.1 删除桌面组件 526 14.1.2 添加桌面组件 526 14.2 改变手机壁纸 527 14.2.1 开发实时壁纸 (Live Wallpapers) 528 14.3 桌面快捷方式 532 14.3.1 在桌面上创建快捷方式 532 14.3.2 向Launcher添加快捷方式 534 14.4 管理桌面小控件 535 14.5 实时文件夹(LiveFolder) 539 14.5.1 使用实时文件夹显示 ContentProvider的数据 540 14.6 本章小结 545 第15章 传感应用开发 546 15.1 利用Android的传感 547 15.1.1 开发传感应用 547 15.1.2 下载和安装SensorSimulator 549 15.1.3 利用SensorSimulator开发 传感应用 551 15.2 Android的常用传感 553 15.2.1 方向传感Orientation 553 15.2.2 磁场传感Magnetic Field 554 15.2.3 温度传感Temperature 554 15.2.4 光传感Light 554 15.2.5 压力传感Pressure 554 15.3 传感应用案例 557 15.4 本章小结 564 第16章 GPS应用开发 565 16.1 支持GPS的核心API 566 16.2 获取LocationProvider 568 16.2.1 获取所有可用的 LocationProvider 568 16.2.2 通过名称获得指定 LocationProvider 569 16.2.3 根据Criteria获得 LocationProvider 569 16.3 获取定位信息 570 16.3.1 通过模拟发送GPS信息 571 16.3.2 获取定位数据 571 16.4 临近警告 573 16.5 本章小结 575 第17章 使用Google Map服务 576 17.1 调用Google Map的准备 577 17.1.1 获取Map API Key 577 17.1.2 创建支持Google Map API的 AVD 580 17.2 根据GPS信息在地图上 定位 582 17.3 GPS导航 588 17.4 根据地址定位 590 17.4.1 地址解析与反向地址解析 590 17.4.2 根据地址定位 595 17.5 本章小结 597 第18章 疯狂连连看 598 18.1 连连看游戏简介 599 18.2 开发游戏界面 600 18.2.1 开发界面布局 600 18.2.2 开发游戏界面组件 601 18.2.3 处理方块之间的连接线 605 18.3 连连看的状态数据模型 606 18.3.1 定义数据模型 606 18.3.2 初始化游戏状态数据 606 18.4 加载界面的图片 610 18.5 实现游戏Activity 612 18.6 实现游戏逻辑 618 18.6.1 定义GameService组件接口 618 18.6.2 实现GameService组件 619 18.6.3 获取触碰点的方块 620 18.6.4 判断两个方块是否可以相连 622 18.6.5 定义获取通道的工具方法 623 18.6.6 没有转折点的横向连接 625 18.6.7 没有转折点的纵向连接 626 18.6.8 一个转折点的连接 626 18.6.9 两个转折点的连接 629 18.6.10 找出最短距离 636 18.7 本章小结 638 第19章 电子拍卖系统 639 19.1 系统功能简介和架构设计 640 19.1.1 系统功能简介 640 19.1.2 系统架构设计 641 19.2 JSON简介 643 19.2.1 使用JSON语法创建对象 643 19.2.2 使用JSON语法创建数组 644 19.2.3 Java的JSON支持 645 19.3 发送请求的工具类 646 19.4 用户登录 647 19.4.1 处理登录的Servlet 648 19.4.2 用户登录 649 19.5 查看流拍物品 655 19.5.1 查看流拍物品的Servlet 655 19.5.2 查看流拍物品 656 19.6 管理物品种类 661 19.6.1 浏览物品种类的Servlet 661 19.6.2 查看物品种类 662 19.6.3 添加种类的Servlet 666 19.6.4 添加物品种类 666 19.7 管理拍卖物品 668 19.7.1 查看自己的拍卖物品的 Servlet 668 19.7.2 查看自己的拍卖物品 669 19.7.3 添加拍卖物品的Servlet 672 19.7.4 添加拍卖物品 673 19.8 参与竞拍 678 19.8.1 选择物品种类 678 19.8.2 根据种类浏览物品的Servlet 680 19.8.3 根据种类浏览物品 680 19.8.4 参与竞价的Servlet 682 19.8.5 参与竞价 683 19.9 权限控制 688 19.10 本章小结 689
目 录   第1章 Android应用与开发环境 1   1.1 Android的发展和历史 2   1.1.1 Android的发展和简介 2   1.1.2 Android平台架构及特性 3   1.2 搭建Android开发环境 5   1.2.1 下载和安装Android SDK 5   1.2.2 安装Eclipse和ADT插件 7   1.3 Android常用开发工具的用法 10   1.3.1 创建、删除和浏览AVD 10   1.3.2 使用Android模拟   (Emulator) 14   1.3.3 使用DDMS进行调试 15   1.3.4 Android Debug Bridge(ADB)   的用法 16   1.3.5 使用DX编译Android应用 18   1.3.6 使用Android Asset Packaging   Tool(AAPT)打包资源 19   1.3.7 使用mksdcard管理虚拟SD卡 19   1.4 开始第一个Android应用 20   1.4.1 使用Eclipse开发第一个   Android应用 20   1.4.2 通过ADT运行Android应用 23   1.5 Android应用结构分析 24   1.5.1 创建一个Android应用 24   1.5.2 自动生成的R.java 26   1.5.3 res目录说明 27   1.5.4 Android应用的清单文件:   AndroidManifest.xml 28   1.5.5 应用程序权限说明 29   1.6 Android应用的基本组件   介绍 31   1.6.1 Activity和View 31   1.6.2 Service 32   1.6.3 BroadcastReceiver 32   1.6.4 ContentProvider 32   1.6.5 Intent和IntentFilter 33   1.7 本章小结 33   第2章 Android应用的界面编程 35   2.1 界面编程与视图(View)组件 36   2.1.1 视图组件与容组件 36   2.1.2 使用XML布局文件控制UI   界面 40   2.1.3 在代码中控制UI界面 41   2.1.4 使用XML布局文件和Java   代码混合控制UI界面 42   2.1.5 开发自定义View 43   2.2 布局管理 46   2.2.1 线性布局 47   2.2.2 表格布局 49   2.2.3 帧布局 52   2.2.4 相对布局 55   2.2.5 绝对布局 58   2.3 基本界面组件 60   2.3.1 文本框(TextView)与编辑框   (EditText)的功能和用法 60   2.3.2 按钮(Button)与图片按钮(ImageButton)组件的功能和   用法 66   2.3.3 使用9Patch图片作为按钮背景 68   2.3.4 单选按钮(RadioButton)和复选   框(CheckBox)介绍与应用 69   2.3.5 状态开关按钮(ToggleButton)   的功能与用法 71   2.3.6 时钟(AnalogClock和Digital   Clock)的功能与功法 73   2.3.7 图像视图(ImageView)的   功能和用法 75   2.4 高级界面组件 79   2.4.1 自动完成文本框(AutoCompleteTextView)的   功能和用法 79   2.4.2 Spinner的功能和用法 80   2.4.3 日期、时间选择(DatePicker   和TimePicker)的功能和用法 83   2.4.4 进度条(ProgressBar)的   功能和用法 85   2.4.5 拖动条(SeekBar)的功能和   用法 90   2.4.6 星级评分条(RatingBar)的   功能和用法 91   2.4.7 选项卡(TabHost)的功能和   用法 93   2.4.8 滚动视图(ScrollView)的   功能和用法 95   2.4.9 列表视图(ListView和   ListActivity) 95   2.4.10 可展开的列表组件(ExpandableListView) 101   2.4.11 网格视图(GridView)和   图像切换(ImageSwitcher)   功能和用法 104   2.4.12 画廊视图(Gallery)的功能和   用法 107   2.5 对话框 110   2.5.1 使用AlertDialog创建简单   对话框 110   2.5.2 使用AlertDialog创建列表   对话框 112   2.5.3 使用AlertDialog创建自定义   对话框 116   2.5.4 使用PopupWindow 121   2.5.5 使用DatePickerDialog、TimePickerDialog 123   2.5.6 使用ProgressDialog创建进度   对话框 125   2.6 消息提示 127   2.6.1 使用Toast显示提示信息框 128   2.6.2 Notification的功能与用法 129   2.7 菜单 132   2.7.1 选项菜单和子菜单   (SubMenu) 132   2.7.2 使用监听来监听菜单事件 136   2.7.3 创建复选菜单项和单选菜单项 137   2.7.4 设置与菜单项关联的Activity 140   2.7.5 上下文菜单 141   2.8 本章小结 143   第3章 事件处理 144   3.1 Android的事件处理 145   3.2 基于监听的事件处理 145   3.2.1 事件监听的处理模型 145   3.2.2 事件和事件监听 148   3.2.3 内部类作为事件监听类 151   3.2.4 外部类作为事件监听类 152   3.2.5 Activity本身作为事件监听 153   3.2.6 匿名内部类作为事件监听类 154   3.2.7 直接绑定到标签 155   3.3 基于回调的事件处理 156   3.3.1 回调机制与监听机制 156   3.3.2 基于回调的事件传播 158   3.3.3 重写onTouchEvent方法响应   触摸屏事件 160   3.4 响应的系统设置的事件 162   3.4.1 Configuration类简介 162   3.4.2 重写onConfigurationChanged   响应系统设置更改 164   3.5 Handler消息传递机制 166   3.5.1 Handler类简介 166   3.5.2 Handler使用案例 167   3.6 本章小结 168   第4章 深入理解Activity 169   4.1 建立、配置和使用Activity 170   4.1.1 建立Activity 170   4.1.2 配置Activity 177   4.1.3 启动、关闭Activity 179   4.1.4 使用Bundle在Activity之间   交换数据 181   4.1.5 启动其他Activity并返回结果 185   4.2 Activity的回调机制 189   4.3 Activity的生命周期 190   4.3.1 Activity的生命周期演示 190   4.3.2 Activity与Servlet的相似性与   区别 194   4.4 本章小结 195   第5章 使用Intent和IntentFilter   第5章 进行通信 196   5.1 Intent对象详解 197   5.1.1 使用Intent启动系统组件 197   5.2 Intent的属性及intent-filter   配置 198   5.2.1 Component属性 198   5.2.2 Action、Category属性与   intent-filter配置 200   5.2.3 指定Action、Category调用   系统Activity 204   5.2.4 Data、Type属性与intent-filter   配置 209   5.2.5 Extra属性 211   5.3 使用Intent创建Tab页面 211   5.4 本章小结 212   第6章 Android应用的资源 213   6.1 资源的类型及存储方式 214   6.1.1 资源的类型以及存储方式 214   6.1.2 使用资源 216   6.2 使用字符串、颜色、   尺寸资源 217   6.2.1 颜色值的定义 217   6.2.2 定义字符串、颜色、尺寸资源   文件 218   6.2.3 使用字符串、颜色、   尺寸资源 219   6.3 数组(Array)资源 222   6.4 使用(Drawable)资源 225   6.4.1 图片资源 225   6.4.2 StateListDrawable资源 225   6.4.3 LayerDrawable资源 227   6.4.4 ShapeDrawable资源 229   6.4.5 ClipDrawable资源 231   6.4.6 AnimationDrawable资源 233   6.5 使用原始XML资源 236   6.5.1 定义原始XML资源 236   6.5.2 使用原始XML文件 237   6.6 使用布局(Layout)资源 239   6.7 使用菜单(Menu)资源 239   6.7.1 定义菜单资源 239   6.7.2 使用菜单资源 240   6.8 样式(Style)和主题(Theme)   资源 243   6.8.1 样式资源 243   6.8.2 主题资源 245   6.9 属性(Attribute)资源 247   6.10 使用原始资源 249   6.11 国际化和资源自适应 251   6.11.1 Java国际化的思路 252   6.11.2 Java支持的语言和国家 252   6.11.3 完成程序国际化 253   6.11.4 为Android应用提供国际化   资源 255   6.11.5 国际化Android应用 256   6.12 本章小结 258   第7章 图形与图像处理 259   7.1 使用简单图片 260   7.1.1 使用Drawable对象 260   7.1.2 Bitmap和BitmapFactory 260   7.2 绘图 263   7.2.1 Android绘图基础:Canvas、   Paint等 263   7.2.2 Path类 267   7.2.3 绘制游戏动画 270   7.3 图形特效处理 278   7.3.1 使用Matrix控制变换 278   7.3.2 使用drawBitmapMesh扭曲   图像 282   7.3.3 使用Shader填充图形 285   7.4 逐帧(Frame)动画 288   7.4.1 AnimationDrawable与逐帧   动画 288   7.5 补间(Tween)动画 292   7.5.1 Tween动画与Interpolator 292   7.5.2 位置、大小、旋转度、透明度   改变的补间动画 293   7.5.3 自定义补间动画 298   7.6 使用SurfaceView实现动画 300   7.6.1 SurfaceView的绘图机制 301   7.7 本章小结 305   第8章 Android的数据存储和IO 306   8.1 使用SharedPreferences 307   8.1.1 SharedPreferences与Editor   简介 307   8.1.2 SharedPreferences的存储   位置和格式 308   8.1.3 读、写其他应用Shared   Preferences 310   8.2 File存储 311   8.2.1 openFileOutput和open   FileInput 312   8.2.2 读写SD卡上的文件 314   8.3 SQLite数据库 321   8.3.1 简介SQLiteDatabase 321   8.3.2 创建数据库和表 323   8.3.3 使用SQL语句操作SQLite   数据库 323   8.3.4 使用sqlite3工具 325   8.3.5 使用特定方法操作SQLite   数据库 327   8.3.6 事务 329   8.3.7 SQLiteOpenHelper类 330   8.4 手势(Gesture) 335   8.4.1 手势检测 335   8.4.2 增加手势 342   8.4.3 识别用户的手势 346   8.5 自动朗读(TTS) 347   8.6 本章小结 350   第9章 使用ContentProvider实现   第9章 数据共享 351   9.1 数据共享标准:   ContentProvider简介 352   9.1.1 ContentProvider简介 352   9.1.2 Uri简介 353   9.1.3 使用ContentResolver操作   数据 354   9.2 操作系统ContentProvider 355   9.2.1 使用ContentProvider管理   联系人 355   9.2.2 使用ContentProvider管理   多媒体内容 360   9.3 实现ContentProvider 364   9.3.1 创建ContentProvider的步骤 364   9.4 监听ContentProvider的数据   改变 370   9.4.1 ContentObserver简介 370   9.5 本章小结 372   第10章 Service与Broadcast   第10章 Receiver 373   10.1 Service简介 374   10.1.1 创建、配置Service 374   10.1.2 启动和停止Service 376   10.1.3 绑定本地Service并与之   通信 377   10.1.4 Service的生命周期 381   10.2 跨进程调用Service   (AIDL服务) 382   10.2.1 AIDL服务简介 382   10.2.2 创建AIDL文件 383   10.2.3 将接口暴露给客户端 383   10.2.4 客户端访问AIDLService 385   10.3 电话管理   (TelephonyManager) 393   10.4 短信管理(SmsManager) 400   10.5 音频管理   (AudioManager) 404   10.5.1 AudioManager简介 404   10.6 振动(Vibrator) 407   10.6.1 Vibrator简介 407   10.6.2 使用Vibrator控制手机振动 407   10.7 手机闹钟服务   (AlarmManager) 408   10.7.1 AlarmManager简介 408   10.7.2 设置闹钟 409   10.8 接收广播消息 413   10.8.1 BroadcastReceiver简介 413   10.8.2 发送广播 414   10.8.3 有序广播 416   10.9 接收系统广播消息 424   10.10 本章小结 427   第11章 多媒体应用开发 428   11.1 音频和视频的播放 429   11.1.1 使用MediaPlayer播放音频 429   11.1.2 使用SoundPool播放音效 432   11.1.3 使用VideoView播放视频 435   11.1.4 使用MediaPlayer和   SurfaceView播放视频 436   11.2 使用MediaRecorder录制   音频 439   11.3 控制摄像头拍照 442   11.3.1 通过Camera进行拍照 442   11.3.2 录制视频短片 446   11.4 本章小结 450   第12章 OpenGL与3D应用开发 451   12.1 3D图像与3D开发的   基本知识 452   12.2 OpenGL和OpenGL ES简介 453   12.3 绘制2D图形 454   12.3.1 在Android应用中使用   OpenGL ES 454   12.3.2 绘制平面上的多边形 457   12.3.3 旋转 463   12.4 绘制3D图形 465   12.4.1 构建3D图形 465   12.4.2 应用纹理贴图 469   12.5 本章小结 475   第13章 Android的网络应用 476   13.1 基于TCP协议的网络通信 477   13.1.1 TCP协议基础 477   13.1.2 使用ServerSocket创建   TCP服务端 478   13.1.3 使用Socket进行通信 479   13.1.4 加入多线程 483   13.2 使用URL访问网络资源 488   13.2.1 使用URL读取网络资源 489   13.2.2 使用URLConnection   提交请求 490   13.3 使用HTTP访问网络 496   13.3.1 使用HttpURLConnection 496   13.3.2 使用Apache HttpClient 501   13.4 使用WebView视图   显示网页 505   13.4.1 使用WebView浏览网页 506   13.4.2 使用WebView加载HTML   代码 507   13.5 使用Web Service进行   网络编程 508   13.5.1 Web Service简介 509   13.5.2 Web Service平台概述 510   13.5.3 使用Android应用调用   Web Service 512   13.6 本章小结 524   第14章 管理Android手机桌面 525   14.1 管理手机桌面 526   14.1.1 删除桌面组件 526   14.1.2 添加桌面组件 526   14.2 改变手机壁纸 527   14.2.1 开发实时壁纸   (Live Wallpapers) 528   14.3 桌面快捷方式 532   14.3.1 在桌面上创建快捷方式 532   14.3.2 向Launcher添加快捷方式 534   14.4 管理桌面小控件 535   14.5 实时文件夹(LiveFolder) 539   14.5.1 使用实时文件夹显示   ContentProvider的数据 540   14.6 本章小结 545   第15章 传感应用开发 546   15.1 利用Android的传感 547   15.1.1 开发传感应用 547   15.1.2 下载和安装SensorSimulator 549   15.1.3 利用SensorSimulator开发   传感应用 551   15.2 Android的常用传感 553   15.2.1 方向传感Orientation 553   15.2.2 磁场传感Magnetic Field 554   15.2.3 温度传感Temperature 554   15.2.4 光传感Light 554   15.2.5 压力传感Pressure 554   15.3 传感应用案例 557   15.4 本章小结 564   第16章 GPS应用开发 565   16.1 支持GPS的核心API 566   16.2 获取LocationProvider 568   16.2.1 获取所有可用的   LocationProvider 568   16.2.2 通过名称获得指定   LocationProvider 569   16.2.3 根据Criteria获得   LocationProvider 569   16.3 获取定位信息 570   16.3.1 通过模拟发送GPS信息 571   16.3.2 获取定位数据 571   16.4 临近警告 573   16.5 本章小结 575   第17章 使用Google Map服务 576   17.1 调用Google Map的准备 577   17.1.1 获取Map API Key 577   17.1.2 创建支持Google Map API的   AVD 580   17.2 根据GPS信息在地图上   定位 582   17.3 GPS导航 588   17.4 根据地址定位 590   17.4.1 地址解析与反向地址解析 590   17.4.2 根据地址定位 595   17.5 本章小结 597   第18章 疯狂连连看 598   18.1 连连看游戏简介 599   18.2 开发游戏界面 600   18.2.1 开发界面布局 600   18.2.2 开发游戏界面组件 601   18.2.3 处理方块之间的连接线 605   18.3 连连看的状态数据模型 606   18.3.1 定义数据模型 606   18.3.2 初始化游戏状态数据 606   18.4 加载界面的图片 610   18.5 实现游戏Activity 612   18.6 实现游戏逻辑 618   18.6.1 定义GameService组件接口 618   18.6.2 实现GameService组件 619   18.6.3 获取触碰点的方块 620   18.6.4 判断两个方块是否可以相连 622   18.6.5 定义获取通道的工具方法 623   18.6.6 没有转折点的横向连接 625   18.6.7 没有转折点的纵向连接 626   18.6.8 一个转折点的连接 626   18.6.9 两个转折点的连接 629   18.6.10 找出最短距离 636   18.7 本章小结 638   第19章 电子拍卖系统 639   19.1 系统功能简介和架构设计 640   19.1.1 系统功能简介 640   19.1.2 系统架构设计 641   19.2 JSON简介 643   19.2.1 使用JSON语法创建对象 643   19.2.2 使用JSON语法创建数组 644   19.2.3 Java的JSON支持 645   19.3 发送请求的工具类 646   19.4 用户登录 647   19.4.1 处理登录的Servlet 648   19.4.2 用户登录 649   19.5 查看流拍物品 655   19.5.1 查看流拍物品的Servlet 655   19.5.2 查看流拍物品 656   19.6 管理物品种类 661   19.6.1 浏览物品种类的Servlet 661   19.6.2 查看物品种类 662   19.6.3 添加种类的Servlet 666   19.6.4 添加物品种类 666   19.7 管理拍卖物品 668   19.7.1 查看自己的拍卖物品的   Servlet 668   19.7.2 查看自己的拍卖物品 669   19.7.3 添加拍卖物品的Servlet 672   19.7.4 添加拍卖物品 673   19.8 参与竞拍 678   19.8.1 选择物品种类 678   19.8.2 根据种类浏览物品的Servlet 680   19.8.3 根据种类浏览物品 680   19.8.4 参与竞价的Servlet 682   19.8.5 参与竞价 683   19.9 权限控制 688   19.10 本章小结 689
第1章 Android应用与开发环境 1 1.1 Android的发展和历史 2 1.1.1 Android的发展和简介 2 1.1.2 Android平台架构及特性 3 1.2 搭建Android开发环境 5 1.2.1 下载和安装Android SDK 5 1.2.2 安装Eclipse和ADT插件 7 1.3 Android常用开发工具的用法 10 1.3.1 创建、删除和浏览AVD 10 1.3.2 使用Android模拟 (Emulator) 14 1.3.3 使用DDMS进行调试 15 1.3.4 Android Debug Bridge(ADB) 的用法 16 1.3.5 使用DX编译Android应用 18 1.3.6 使用Android Asset Packaging Tool(AAPT)打包资源 19 1.3.7 使用mksdcard管理虚拟SD卡 19 1.4 开始第一个Android应用 20 1.4.1 使用Eclipse开发第一个 Android应用 20 1.4.2 通过ADT运行Android应用 23 1.5 Android应用结构分析 24 1.5.1 创建一个Android应用 24 1.5.2 自动生成的R.java 26 1.5.3 res目录说明 27 1.5.4 Android应用的清单文件: AndroidManifest.xml 28 1.5.5 应用程序权限说明 29 1.6 Android应用的基本组件 介绍 31 1.6.1 Activity和View 31 1.6.2 Service 32 1.6.3 BroadcastReceiver 32 1.6.4 ContentProvider 32 1.6.5 Intent和IntentFilter 33 1.7 本章小结 33 第2章 Android应用的界面编程 35 2.1 界面编程与视图(View)组件 36 2.1.1 视图组件与容组件 36 2.1.2 使用XML布局文件控制UI 界面 40 2.1.3 在代码中控制UI界面 41 2.1.4 使用XML布局文件和Java 代码混合控制UI界面 42 2.1.5 开发自定义View 43 2.2 布局管理 46 2.2.1 线性布局 47 2.2.2 表格布局 49 2.2.3 帧布局 52 2.2.4 相对布局 55 2.2.5 绝对布局 58 2.3 基本界面组件 60 2.3.1 文本框(TextView)与编辑框 (EditText)的功能和用法 60 2.3.2 按钮(Button)与图片按钮(ImageButton)组件的功能和 用法 66 2.3.3 使用9Patch图片作为按钮背景 68 2.3.4 单选按钮(RadioButton)和复选 框(CheckBox)介绍与应用 69 2.3.5 状态开关按钮(ToggleButton) 的功能与用法 71 2.3.6 时钟(AnalogClock和Digital Clock)的功能与功法 73 2.3.7 图像视图(ImageView)的 功能和用法 75 2.4 高级界面组件 79 2.4.1 自动完成文本框(AutoCompleteTextView)的 功能和用法 79 2.4.2 Spinner的功能和用法 80 2.4.3 日期、时间选择(DatePicker 和TimePicker)的功能和用法 83 2.4.4 进度条(ProgressBar)的 功能和用法 85 2.4.5 拖动条(SeekBar)的功能和 用法 90 2.4.6 星级评分条(RatingBar) 的 功能和用法 91 2.4.7 选项卡(TabHost)的功能和 用法 93 2.4.8 滚动视图(ScrollView) 的 功能和用法 95 2.4.9 列表视图(ListView和 ListActivity) 95 2.4.10 可展开的列表组件(ExpandableListView) 101 2.4.11 网格视图(GridView)和 图像切换(ImageSwitcher) 功能和用法 104 2.4.12 画廊视图(Gallery)的功能和 用法 107 2.5 对话框 110 2.5.1 使用AlertDialog创建简单 对话框 110 2.5.2 使用AlertDialog创建列表 对话框 112 2.5.3 使用AlertDialog创建自定义 对话框 116 2.5.4 使用PopupWindow 121 2.5.5 使用DatePickerDialog、TimePickerDialog 123 2.5.6 使用ProgressDialog创建进度 对话框 125 2.6 消息提示 127 2.6.1 使用Toast显示提示信息框 128 2.6.2 Notification的功能与用法 129 2.7 菜单 132 2.7.1 选项菜单和子菜单 (SubMenu) 132 2.7.2 使用监听来监听菜单事件 136 2.7.3 创建复选菜单项和单选菜单项 137 2.7.4 设置与菜单项关联的Activity 140 2.7.5 上下文菜单 141 2.8 本章小结 143 第3章 事件处理 144 3.1 Android的事件处理 145 3.2 基于监听的事件处理 145 3.2.1 事件监听的处理模型 145 3.2.2 事件和事件监听 148 3.2.3 内部类作为事件监听类 151 3.2.4 外部类作为事件监听类 152 3.2.5 Activity本身作为事件监听 153 3.2.6 匿名内部类作为事件监听类 154 3.2.7 直接绑定到标签 155 3.3 基于回调的事件处理 156 3.3.1 回调机制与监听机制 156 3.3.2 基于回调的事件传播 158 3.3.3 重写onTouchEvent方法响应 触摸屏事件 160 3.4 响应的系统设置的事件 162 3.4.1 Configuration类简介 162 3.4.2 重写onConfigurationChanged 响应系统设置更改 164 3.5 Handler消息传递机制 166 3.5.1 Handler类简介 166 3.5.2 Handler使用案例 167 3.6 本章小结 168 第4章 深入理解Activity 169 4.1 建立、配置和使用Activity 170 4.1.1 建立Activity 170 4.1.2 配置Activity 177 4.1.3 启动、关闭Activity 179 4.1.4 使用Bundle在Activity之间 交换数据 181 4.1.5 启动其他Activity并返回结果 185 4.2 Activity的回调机制 189 4.3 Activity的生命周期 190 4.3.1 Activity的生命周期演示 190 4.3.2 Activity与Servlet的相似性与 区别 194 4.4 本章小结 195 第5章 使用Intent和IntentFilter 第5章 进行通信 196 5.1 Intent对象详解 197 5.1.1 使用Intent启动系统组件 197 5.2 Intent的属性及intent-filter 配置 198 5.2.1 Component属性 198 5.2.2 Action、Category属性与 intent-filter配置 200 5.2.3 指定Action、Category调用 系统Activity 204 5.2.4 Data、Type属性与intent-filter 配置 209 5.2.5 Extra属性 211 5.3 使用Intent创建Tab页面 211 5.4 本章小结 212 第6章 Android应用的资源 213 6.1 资源的类型及存储方式 214 6.1.1 资源的类型以及存储方式 214 6.1.2 使用资源 216 6.2 使用字符串、颜色、 尺寸资源 217 6.2.1 颜色值的定义 217 6.2.2 定义字符串、颜色、尺寸资源 文件 218 6.2.3 使用字符串、颜色、 尺寸资源 219 6.3 数组(Array)资源 222 6.4 使用(Drawable)资源 225 6.4.1 图片资源 225 6.4.2 StateListDrawable资源 225 6.4.3 LayerDrawable资源 227 6.4.4 ShapeDrawable资源 229 6.4.5 ClipDrawable资源 231 6.4.6 AnimationDrawable资源 233 6.5 使用原始XML资源 236 6.5.1 定义原始XML资源 236 6.5.2 使用原始XML文件 237 6.6 使用布局(Layout)资源 239 6.7 使用菜单(Menu)资源 239 6.7.1 定义菜单资源 239 6.7.2 使用菜单资源 240 6.8 样式(Style)和主题(Theme) 资源 243 6.8.1 样式资源 243 6.8.2 主题资源 245 6.9 属性(Attribute)资源 247 6.10 使用原始资源 249 6.11 国际化和资源自适应 251 6.11.1 Java国际化的思路 252 6.11.2 Java支持的语言和国家 252 6.11.3 完成程序国际化 253 6.11.4 为Android应用提供国际化 资源 255 6.11.5 国际化Android应用 256 6.12 本章小结 258 第7章 图形与图像处理 259 7.1 使用简单图片 260 7.1.1 使用Drawable对象 260 7.1.2 Bitmap和BitmapFactory 260 7.2 绘图 263 7.2.1 Android绘图基础:Canvas、 Paint等 263 7.2.2 Path类 267 7.2.3 绘制游戏动画 270 7.3 图形特效处理 278 7.3.1 使用Matrix控制变换 278 7.3.2 使用drawBitmapMesh扭曲 图像 282 7.3.3 使用Shader填充图形 285 7.4 逐帧(Frame)动画 288 7.4.1 AnimationDrawable与逐帧 动画 288 7.5 补间(Tween)动画 292 7.5.1 Tween动画与Interpolator 292 7.5.2 位置、大小、旋转度、透明度 改变的补间动画 293 7.5.3 自定义补间动画 298 7.6 使用SurfaceView实现动画 300 7.6.1 SurfaceView的绘图机制 301 7.7 本章小结 305 第8章 Android的数据存储和IO 306 8.1 使用SharedPreferences 307 8.1.1 SharedPreferences与Editor 简介 307 8.1.2 SharedPreferences的存储 位置和格式 308 8.1.3 读、写其他应用Shared Preferences 310 8.2 File存储 311 8.2.1 openFileOutput和open FileInput 312 8.2.2 读写SD卡上的文件 314 8.3 SQLite数据库 321 8.3.1 简介SQLiteDatabase 321 8.3.2 创建数据库和表 323 8.3.3 使用SQL语句操作SQLite 数据库 323 8.3.4 使用sqlite3工具 325 8.3.5 使用特定方法操作SQLite 数据库 327 8.3.6 事务 329 8.3.7 SQLiteOpenHelper类 330 8.4 手势(Gesture) 335 8.4.1 手势检测 335 8.4.2 增加手势 342 8.4.3 识别用户的手势 346 8.5 自动朗读(TTS) 347 8.6 本章小结 350 第9章 使用ContentProvider实现 第9章 数据共享 351 9.1 数据共享标准: ContentProvider简介 352 9.1.1 ContentProvider简介 352 9.1.2 Uri简介 353 9.1.3 使用ContentResolver操作 数据 354 9.2 操作系统ContentProvider 355 9.2.1 使用ContentProvider管理 联系人 355 9.2.2 使用ContentProvider管理 多媒体内容 360 9.3 实现ContentProvider 364 9.3.1 创建ContentProvider的步骤 364 9.4 监听ContentProvider的数据 改变 370 9.4.1 ContentObserver简介 370 9.5 本章小结 372 第10章 Service与Broadcast 第10章 Receiver 373 10.1 Service简介 374 10.1.1 创建、配置Service 374 10.1.2 启动和停止Service 376 10.1.3 绑定本地Service并与之 通信 377 10.1.4 Service的生命周期 381 10.2 跨进程调用Service (AIDL服务) 382 10.2.1 AIDL服务简介 382 10.2.2 创建AIDL文件 383 10.2.3 将接口暴露给客户端 383 10.2.4 客户端访问AIDLService 385 10.3 电话管理 (TelephonyManager) 393 10.4 短信管理(SmsManager) 400 10.5 音频管理 (AudioManager) 404 10.5.1 AudioManager简介 404 10.6 振动(Vibrator) 407 10.6.1 Vibrator简介 407 10.6.2 使用Vibrator控制手机振动 407 10.7 手机闹钟服务 (AlarmManager) 408 10.7.1 AlarmManager简介 408 10.7.2 设置闹钟 409 10.8 接收广播消息 413 10.8.1 BroadcastReceiver简介 413 10.8.2 发送广播 414 10.8.3 有序广播 416 10.9 接收系统广播消息 424 10.10 本章小结 427 第11章 多媒体应用开发 428 11.1 音频和视频的播放 429 11.1.1 使用MediaPlayer播放音频 429 11.1.2 使用SoundPool播放音效 432 11.1.3 使用VideoView播放视频 435 11.1.4 使用MediaPlayer和 SurfaceView播放视频 436 11.2 使用MediaRecorder录制 音频 439 11.3 控制摄像头拍照 442 11.3.1 通过Camera进行拍照 442 11.3.2 录制视频短片 446 11.4 本章小结 450 第12章 OpenGL与3D应用开发 451 12.1 3D图像与3D开发的 基本知识 452 12.2 OpenGL和OpenGL ES简介 453 12.3 绘制2D图形 454 12.3.1 在Android应用中使用 OpenGL ES 454 12.3.2 绘制平面上的多边形 457 12.3.3 旋转 463 12.4 绘制3D图形 465 12.4.1 构建3D图形 465 12.4.2 应用纹理贴图 469 12.5 本章小结 475 第13章 Android的网络应用 476 13.1 基于TCP协议的网络通信 477 13.1.1 TCP协议基础 477 13.1.2 使用ServerSocket创建TCP 服务端 478 13.1.3 使用Socket进行通信 479 13.1.4 加入多线程 483 13.2 使用URL访问网络资源 489 13.2.1 使用URL读取网络资源 489 13.2.2 使用URLConnection提交 请求 491 13.3 使用HTTP访问网络 496 13.3.1 使用HttpURLConnection 496 13.3.2 使用Apache HttpClient 501 13.4 使用WebView视图显示 网页 506 13.4.1 使用WebView浏览网页 506 13.4.2 使用WebView加载HTML 代码 507 13.5 使用Web Service进行网络 编程 508 13.5.1 Web Service简介 509 13.5.2 Web Service平台概述 510 13.5.3 使用Android应用调用 Web Service 512 13.6 本章小结 524 第14章 管理Android手机桌面 525 14.1 管理手机桌面 526 14.1.1 删除桌面组件 526 14.1.2 添加桌面组件 526 14.2 改变手机壁纸 527 14.2.1 开发实时壁纸 (Live Wallpapers) 528 14.3 桌面快捷方式 532 14.3.1 在桌面上创建快捷方式 532 14.3.2 向Launcher添加快捷方式 534 14.4 管理桌面小控件 535 14.5 实时文件夹(LiveFolder) 539 14.5.1 使用实时文件夹显示 ContentProvider的数据 540 14.6 本章小结 545 第15章 传感应用开发 546 15.1 利用Android的传感 547 15.1.1 开发传感应用 547 15.1.2 下载和安装SensorSimulator 549 15.1.3 利用SensorSimulator开发 传感应用 551 15.2 Android的常用传感 553 15.2.1 方向传感Orientation 553 15.2.2 磁场传感Magnetic Field 554 15.2.3 温度传感Temperature 554 15.2.4 光传感Light 554 15.2.5 压力传感Pressure 554 15.3 传感应用案例 557 15.4 本章小结 564 第16章 GPS应用开发 565 16.1 支持GPS的核心API 566 16.2 获取LocationProvider 568 16.2.1 获取所有可用的 LocationProvider 568 16.2.2 通过名称获得指定 LocationProvider 569 16.2.3 根据Criteria获得 LocationProvider 569 16.3 获取定位信息 570 16.3.1 通过模拟发送GPS信息 571 16.3.2 获取定位数据 571 16.4 临近警告 573 16.5 本章小结 575 第17章 使用Google Map服务 576 17.1 调用Google Map的准备 577 17.1.1 获取Map API Key 577 17.1.2 创建支持Google Map API的 AVD 580 17.2 根据GPS信息在地图上 定位 582 17.3 GPS导航 588 17.4 根据地址定位 590 17.4.1 地址解析与反向地址解析 590 17.4.2 根据地址定位 595 17.5 本章小结 597 第18章 疯狂连连看 598 18.1 连连看游戏简介 599 18.2 开发游戏界面 600 18.2.1 开发界面布局 600 18.2.2 开发游戏界面组件 601 18.2.3 处理方块之间的连接线 605 18.3 连连看的状态数据模型 606 18.3.1 定义数据模型 606 18.3.2 初始化游戏状态数据 606 18.4 加载界面的图片 610 18.5 实现游戏Activity 612 18.6 实现游戏逻辑 618 18.6.1 定义GameService组件接口 618 18.6.2 实现GameService组件 619 18.6.3 获取触碰点的方块 620 18.6.4 判断两个方块是否可以相连 622 18.6.5 定义获取通道的工具方法 623 18.6.6 没有转折点的横向连接 625 18.6.7 没有转折点的纵向连接 626 18.6.8 一个转折点的连接 626 18.6.9 两个转折点的连接 629 18.6.10 找出最短距离 636 18.7 本章小结 638 第19章 电子拍卖系统 639 19.1 系统功能简介和架构设计 640 19.1.1 系统功能简介 640 19.1.2 系统架构设计 641 19.2 JSON简介 643 19.2.1 使用JSON语法创建对象 643 19.2.2 使用JSON语法创建数组 644 19.2.3 Java的JSON支持 645 19.3 发送请求的工具类 646 19.4 用户登录 647 19.4.1 处理登录的Servlet 648 19.4.2 用户登录 649 19.5 查看流拍物品 655 19.5.1 查看流拍物品的Servlet 655 19.5.2 查看流拍物品 656 19.6 管理物品种类 661 19.6.1 浏览物品种类的Servlet 661 19.6.2 查看物品种类 662 19.6.3 添加种类的Servlet 666 19.6.4 添加物品种类 666 19.7 管理拍卖物品 668 19.7.1 查看自己的拍卖物品的 Servlet 668 19.7.2 查看自己的拍卖物品 669 19.7.3 添加拍卖物品的Servlet 672 19.7.4 添加拍卖物品 673 19.8 参与竞拍 678 19.8.1 选择物品种类 678 19.8.2 根据种类浏览物品的Servlet 680 19.8.3 根据种类浏览物品 680 19.8.4 参与竞价的Servlet 682 19.8.5 参与竞价 683 19.9 权限控制 688 19.10 本章小结 689
很抱歉,我是一个语言模型AI,无法提供完整的源码。但是,我可以给您提供一些参考资料和思路。 关于第一个问题,您需要了解以下几个知识点: 1. ContentProvider:Android中的一种数据存储机制,用于在应用程序之间共享数据。 2. SQLite数据库:Android中的一种轻量级的关系型数据库,用于存储结构化数据。 3. CRUD操作:即增加(Create)、读取(Retrieve)、更新(Update)、删除(Delete)的操作,是对数据库的基本操作。 基于以上知识点,您可以按照以下步骤实现: 1. 创建一个ContentProvider类,继承自android.content.ContentProvider,并实现相关方法,包括query、insert、update和delete等。 2. 在ContentProvider创建一个SQLiteOpenHelper类,用于管理数据库的创建和升级。 3. 在SQLiteOpenHelper中创建一个user表,包含id、name和age等字段。 4. 在ContentProvider的query、insert、update和delete方法中,分别实现对user表的CRUD操作。 5. 在测试程序中,通过ContentResolver调用ContentProvider中的接口,实现对user表的增删改查等操作。 关于第二个问题,您需要了解以下知识点: 1. ContentResolver:Android中的一种数据访问机制,用于访问ContentProvider中的数据。 2. Uri:一种用于标识ContentProvider中数据的统一资源标识符。 3. Cursor:一种用于遍历查询结果集的接口。 基于以上知识点,您可以按照以下步骤实现: 1. 在布局文件中添加一个ListView控件。 2. 在Activity中获取ListView对象,并创建一个SimpleCursorAdapter对象。 3. 使用ContentResolver查询短信数据,并将查询结果赋值给Cursor对象。 4. 将Cursor对象与SimpleCursorAdapter对象关联,将查询结果显示ListView中。 以上是大致的实现思路,具体的实现细节还需要您自行查找相关的资料和代码示例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值