《Android 从入门到精通》学习笔记

第1章 Android快速入门

  1. 什么是Android

    平台特性平台架构、Android市场

  2. 搭建Android开发环境

    EclipseAndroid Studio

  3. 第一个Android程序

    创建Android应用程序

    Android项目结构说明: EclipseAndroid StudioAndroid Studio

    运行Android应用程序

    调试Android应用程序

    Android应用开发流程

第2章 Android模拟器与常用命令

  1. 使用Android模拟器
  2. SDK 中常用命令
    adb、android、emulator、mksdcard; ADB 基本命令

第3章用户界面设计

  1. 控制UI界面
    XML布局文件、JAVA代码、XML与JAVA混合控制、自定义View

  2. 布局管理器
    LinearLayoutTableLayoutFrameLayoutRelativeLayout

  3. 基本组件
    文本框与编辑框: TextViewEditText

    按钮: Button

    单选按钮和复选框: RadioButtonCheckBox

    图像视图: ImageView

    列表选择框: Spinner

    列表视图: ListView

    日期、时间拾取器: DatePickerTimePicker

    计时器: Chronometer

第4章高级用户界面设计

  1. 高级组件
    自动完成文本框: AutoCompleteTextView

    进度条: ProgressBar

    拖动条和星际评分条: SeekBarRatingBar

    选项卡: TabHostTabWidgetLayoutInflater

    图像切换器: ImageSwitcher

    网格视图: GridViewSimpleAdapterBaseAdapter

    画廊视图: Gallery

  2. 消息提示框和对话框
    消息提示框: Toast

    通知: NotificationNotificationManager

    1)调用getSystemService()方法获取系统的NotificationManager服务  
    2)创建一个Notification对象,并为其设置各种属性  
    3)位Notification对象设置事件信息  
    4)通过NotificationManager类的notify()方法发送Notification通知
    

    对话框: AlertDialogAlterDialog.Builder

第5章基本程序单元Activity

  1. Activity 概述

    四个状态:活动、暂停、停止、销毁(暂停和停止区别:内存低时能否被系统杀死)

    Activity 生命周期及回调方法:

    Activity 生命周期及回调方法

  2. 创建、配置、启动和关闭Activity

    创建Activity步骤:

    1. 创建一个Activity类(继承app.Activity或其子类)
    2. 重写需要的回调方法

    配置Activity:

    1. 在xml文件中配置

    启动和关闭Activity:

    1. startActivity()
    2. finish()
  3. 多个Activity的使用
    使用 Bundle在Activity之间交换数据:startActivity( intent)

    调用另一个Activity并返回结果:startActivityForResult(intent, code)、onActivityResult(requestCode, resultCode, intent)

  4. 使用 Fragment
    一个Activity中使用多个Fragent、一个Fragment可以在多个Activity中重用

    1. 创建Fragment:创建一个Fragment的子类、重写nCreateView()方法
    2. 在Activity中添加Fragment:1在布局文件中添加;2在Activity运行时将Fragment放入

第6章 Android应用核心Intent

  1. Intent对象
    Intent用于激活或控制Activity、Service和BroadcastReceiver这3种核心组件。
    Intent包含组件名称( ComponentName)、动作(Action)、数据(Data)、种类(Category)、额外(Extras)和标记(Flags)等内容

    1. ComponentName:目标组件的名称,由完全限定的类名和包名组成
    2. Action:在Intent类中,定义了一系列动作常量,其目标组件包括Activity和Broadcast两类。 标准 Activity 动作说明标准广播动作说明
    3. Data:操作数据的URI和MIME类型
    4. Category:一个字符串,包含了应当处理当前Intent的组件类型的附加信息。 标准种类说明
    5. Extras:是一组键值对时,其中包含了应该传递给处理Intent的组件的额外信息。
    6. Flags:表示不同来源的标记。多数用于指示Android系统如何启动Activity,以及启动后如何对待。
  2. Intent使用
    显式Intent通过组件名称来指定目标组件,通常用于应用程序内部消息;
    隐式Intent不指定组件名称,通常用于激活其它应用程序中的组件;隐式Intent通过比较Intent对象内容和Intent过滤器来实现。
    如果组件中没有任何过滤器,则只能接收显式Intent;如果包含过滤器,则可以接收显式和隐式类型的Intent。
    在使用Intent过滤器测试Intent对象时,对象中仅有动作、数据、种类3个方面与其有关。

  3. Intent 过滤器
    Activity、Service、BroadcastReceiver通过定义Intent过滤器来通知系统它们可以处理哪些隐式Intent;

    过滤器并不干预显式Intent,无论其内容如何,总可以发送给其目标。

    过滤器对于动作、数据、种类3个方面分别进行测试,仅有通过全部测试时,Intent对象才能发送给拥有该过滤器的组件;

    通过动作测试的条件:

    通过数据测试的条件:

    通过种类测试的条件:

第7章 Android事件处理

  1. 事件处理概述

    通过事件实现人机交互,事件主要包括键盘事件和触摸事件两大类;键盘事件包括按下、弹起等,触摸事件包括按下、弹起、滑动、双击,等。

  2. 处理键盘事件

    Android 设备可用物理按键及触发事件、处理物理按键时,提供的回调方法有onKeyUp()、onKeyDown()、onKeyLongPress()。

    KeyEventMotionEventAndroid 拦截返回键事件

  3. 处理触摸事件

    触摸屏上的按钮:onClickListener()、onLongClickListener()

  4. 手势的创建和识别

    GestureLibraryOnGesturePerformedListenerGestureOverlayView

第8章资源访问

资源是指可以在代码中使用的外部文件,这些文件作为应用程序的一部分被编译到应用程序中。各种资源都被保存到res目录下的各个子目录中。

资源可以被java文件使用,也可以被其它xml文件使用。

资源包括:字符串、颜色、尺寸、布局、数组、图片、StateListDrawable、样式、主题、菜单资源,等。
  1. 字符串(string)资源

    定义: res\values\strings.xml\<resources><string name="name">string-content</string></resources>

    使用:

    1. 在java文件中:getResources().getString([<package>.]R.string.name);
    2. 在xml文件中:@[<package>:]string/name
  2. 颜色(color)资源

    颜色值的定义: #RGB** 、 #ARGB#RRGGBB 、 **#AARRGGBB (都是十六进制)

    定义: res\values\colors.xml\<resources><color name="name">颜色值</color></resources>

    使用:

    1. 在java文件中:getResources().getColor([package.]R.color.name);
    2. 在xml文件中:@[<package>:]color/name
  3. 尺寸(dimen)资源

    Android支持的尺寸单位:px(像素)、in(英尺)、pt(磅)、dip(设置独立像素)、sp(比例像素)、mm(毫米)

    定义: res\values\dimens.xml\<resources><dimen name="name"> 尺寸值 </dimen></resources>

    使用:

    1. 在java文件中:getResources().getDimension([package.]R.dimen.name);
    2. 在xml文件中:@[<package>:]dimen/name
  4. 布局(layout)资源

    定义: res\layout\文件名.xml

    使用:

    1. 在java文件中:[package.]R.layout.文件名
    2. 在xml文件中:@[<package>:]layout/文件名
  5. 数组(array)资源

    <array>:用于定义普通类型的数组

    <integer-array>:用于定义整数数组

    <string-array>:用于定义字符串数组

    定义: res\values\**文件名.xml\<resources><array name="数组名 ** "><item>item1</item><item>item2</item>…<item>item-n</item></array></resources>

    使用:

    1. 在java文件中:String[] arr=getResources().getStringArray([package.]R.array.数组名)
    2. 在xml文件中:@[<package>:]array/数组名
  6. Drawable资源

    图片资源:

    定义: res/drawable-{hdpi, mdpi, ldpi}/文件名

    使用:

    1. 在java文件中:[package.]R.drawable.文件名
    2. 在xml文件中: @[<package>:]drawable/文件名

    注意:使用9-Patch图片时不需要加扩展名.9.png

    StateListDrawable资源:

    根据状态来呈现不同的图像

    定义: res/drawable/文件名.xml/<selector><item /><item />…<item /></selector>

    使用:

    1. 在java文件中:[package.]R.drawable.文件名
    2. 在xml文件中: @[<package>:]drawable/文件名
  7. 样式(style)和主题(theme)资源

    样式资源:

    定义: res/values/styles.xml/<resources><style name="name" parent="父样式"><item name="">value</item><item name="">value</item></style></resources>

    使用:

    1. 在xml文件中: @[<package>:]style/name

    主题资源:

    和样式资源类型,但不能作用于单个view组件,而是对所有(或单个)Activity起作用

    定义: res/values/theme.xml/<resources><style name="name"><item name="">value</item></style></resources>

    使用:

    1. 在AndroidManifest.xml文件中使用主题资源: android:theme="@style/name"
    2. 在java文件中使用主题资源:setTheme([package.]R.sytle.name);(注意:要在setContentView()之前设置主题)
  8. 原始XML资源

    定义: res/xml/文件名.xml

    使用:Resources.getXml(R.xml.文件名)

    解析:XmlResourceParser类

  9. 菜单资源

    Android提供了两种实现菜单的方法:通过Java代码和通过菜单资源文件

    定义: res/menu/menus.xml/<menu><item></item><group><item></item><item></item></group></menu>

    使用:

    1. 选项菜单(Option Menu):点击菜单按钮弹出来的菜单

    在onCreate()中重写Activity中的onCreateOptionMenu()方法

    在onCreate()中重写Activity中的onOptionsItemSelected()方法

    1. 上下文菜单(Context Menu):长时间按键不放时弹出的菜单

    在onCreate()中注册上下文菜单registerForContextMenu()

    在onCreate()中重写onCreateContextMenu()方法

    在onCreate()中重写onContextItemSelected()方法

  10. Android程序国际化

    定义: res/values/values-zh-rCN.xml、values-zh-rTW.xml、values-en-rUS.xml

第9章图形图像处理技术

  1. 常用绘图类
    Paint:画笔、用来描述图形的颜色和风格,如线宽、颜色、透明度和填充效果等信息
    Canvas:画布
    Bitmap:位图,可以获取文件信息,进行图像剪切、旋转、缩放等操作,还可以指定格式保存图像文件
    BitmapFactory:工具类,用于从不同的数据源来解析、创建Bitmap对象

  2. 绘制2D图像

    1. 绘制几何图形:Canvas类提供的绘制几何图形的方法
    2. 绘制文本:Canvas. drawText()、Canvas. drawPosText()
    3. 绘制路径:使用android.graphics. Path类来创建路径,使用Canvas. drawPath()绘制路径
    4. 绘制图片: drawBitmap()
  3. 为图形添加特效

    1. 旋转图像:graphics. Matrix类的 setRotate()、 postRotate()、 preRotate()方法,Canvas.drawBitmap(Bitmap, Matrix, Paint)
    2. 缩放图像:android.graphics.Matrix类的 setScale()、 postScale()、 preScale()方法
    3. 倾斜图像:android.graphics.Matrix类的 setSkew()、 postSkew()、 preSkew()方法
    4. 平移图像:android.graphics.Matrix类的 setTranslate()、 postTranslate()、 preTranslate()方法
    5. 使用 BitmapShader渲染图像:创建BitmapShader类的对象,setShader()方法设置Shader对象,使用设置了Shader对象的Paint
  4. Android中的动画

    1. 实现逐帧动画(顺序播放事先准备好的静态图像)
    2. 实现补间动画(通过对场景里的对象不断进行图像变化来产生动画效果)

    透明度渐变( Alpha Animation)、旋转( RotateAnimation)、缩放( ScaleAnimation)、平移( TranslateAnimation

第10章多媒体应用开发

  1. 播放音频与视频

    1. 使用 MediaPlayer类播放音频

    静态方法 create()、 prepare()、 start()、 stop()、 pause()、 reset()、 setOnCompletionListener()

  2. 使用 SoundPool播放音频

    构造函数、 load()、 play()

  3. 使用 VideoView播放视频

    MediaController组件用于通过图形控制界面来控制视频的播放

    在XML布局文件中添加VideoView、setVideoURI()、setVideoPath()、start()、stop()、pause()、setOnCompletionListener()

  4. 使用MediaPlayer和 SurfaceView播放视频

    MediaPlayer除可以播放音频外,还可以播放视频文件,只不过使用MediaPlayer播放视频时,没有提供图像输出的界面。这时,可以用SurfaceView组件来显示视频图像。

    • 定义SurfaceView组件;
    • 创建MediaPlayer对象;
    • 将所播放的视频画面输出到SurfaceView:MediaPlayer.setDisplay(SurfaceView.getHolder());
    • 调用MediaPlayer对象的相应方法控制视频的播放
  5. 控制相机拍照:Camera类已弃用、使用 Camera 2

    Camera.open()、getParameters()、setParameters()、setPreviewDisplay()、startPreview()、stopPreview()、takePicture()、release()

第11章 ContentProvider 实现数据共享

ContentProvider 用于保存和获取数据、并使其对所有应用程序可见。这是不同应用程序间共享数据的唯一方式。

  1. ContentProvider概述

    通过 ContentResolver对象实现对ContentProvider的操作。Activity中通过 getContentResolver()方法来获得ContentResolver对象。

    1. 数据模型:

    ContentProvider使用基于数据库模型的简单表格来提供其中的数据。

    1. URI的用法

    每个ContentProvider提供公共的URI来唯一标识其数据集。管理多个数据集的ContentProvider为每个数据集提供了单独的URI。

    content://com.mingrisoft.employeeprovider/dba/001  
    contnet:// : 标准前缀,无需修改  
    com.mingrisoft.employeeprovider : authority部分,完整的类名  
    dba : ContentProvider的路径部分  
    001 : 被请求的特定记录的ID值,如果请求不仅限于单条记录,应删除该部分及前面的斜线
    
  2. 预定义ContentProvider

    BrowserCallLogContactsLiveFoldersMediaStoreSettingSyncStateContactUserDictionary

    1. 查询数据

      要查询ContentProvider中的数据,需要以下3个信息:
      1)标识该ContentProvider的URI
      2)需要查询的数据字段名称
      3)字段中的数据类型
      4)如果要查询特定记录,还需要记录的ID值
      ContentResolver. query()、Activity. managedQuery(),两者都返回Cursor;后者导致Activity管理Cursor的生命周期。

    2. 增加记录
      ContentValues对象中建立ContentProvider列名到值的键值对映射,然后调用ContentResolver. insert()方法

      1. 增加新值
      2. 批量更新记录
        ContentResolver. update()
    3. 删除记录
      ContentResolver. delete()

  3. 自定义ContentProvider

    1)建立数据存储系统
    2)继承ContentProvider类来提供数据访问方式
    3)在应用程序中的AndroidManifest文件中声明ContentProvider

    1. 继承ContentProvider类
      需要实现ContentProvider类定义的6个抽象方法(由于这些方法能被位于不同线程、进程的不同ContentResolver对象调用,因此必须以线程安全的方式实现)

    2. 声明ContentProvider
      在AndroidManifest.xml文件中定义<provider>元素

第12章线程与消息处理

在Android中,默认情况下,所有的操作都在主线程中进行,主线程负责管理与UI相关的事件,而在用户自己创建的子线程中,不能对UI组件进行操作。

  1. 实现多线程

    创建线程:

    1. 通过 Thread类构造方法创建线程对象并重写run()方法
    2. 通过实现 Runnable接口实现。

    开启线程: start()

    线程休眠: sleep()

    中断线程: interrupt()

  2. Handler消息传递机制

    在Android中,一个线程对应一个Looper对象,而一个Looper对象又对应一个 MessageQueue。MessageQueue被封装到了Looper里面。但是一个线程中可以有多个Handler,这些Handler可以共享同一个Looper和MessageQueue。

    循环者( Looper

    用来为线程开启一个消息循环,从而操作MessageQueue。默认情况下,除了主线程,Android中新创建的线程是没有开启消息循环的。

    开启消息循环:

    1. 使用prepare()初始化一个Looper对象
    2. 创建Handler对象
    3. 使用loop()方法启动Looper,从队列中获取和处理消息。

    Looper类提供的常用方法: prepare()、 loop()、 myLooper()、 getThread()、 quit()

    写在Looper.loop()之后的代码不会被执行,该函数内部是一个循环,当调用Handler.getLooper().quit()方法之后,loop()方法才会终止。

    消息处理类( Handler

    Handler允许发送和处理 Message或者Runnable对象到其所在线程中的MessageQueue()中。Handler主要有以下两个作用:

    1. 将Message或Runnable对象应用post()或sendMessage()方法发送到MessageQueue中
    2. 在子线程与主线程进行通信

    Handler类提供的发送和处理消息的常用方法:

    handleMessage()、 post()、 postAtTime()、 postDelayed()、 sendEmptyMessage()、 sendMessage()、 sendMessageAtTime()、 sendMessageDelayed()

    消息类( Message

    每个Message对象可以通过Message. obtain()或Handler. obtainMessage()方法获得。

第13章 Service应用

Service用于在后台完成用户指定的操作。

  1. Service概述

    Service是能够在后台执行长时间运行操作并且不提供用户界面的应用程序组件。

    分类:

    1. Started:通过 startService()启动服务。能在后台无限期运行,不受启动它的组件生命周期影响。同常,启动服务执行单个操作,并且不会向调用者返回结果。需要停止自身
    2. Bound:通过 bindService()绑定服务。绑定服务允许组件和服务交互、发送请求、获取结果,及进程间通信。多个组件可以一次绑定到一个服务,都解绑时,服务停止。

    重要方法: onStartCommand()、 onBind()、 onCreate()、 onDestroy()、 stopSelf()、 stopService()

    声明:AndroidManifest.xml/<application><service android:xxx="yyy"></service></application>

  2. 创建Started Service

    1. Service:

      如果需要让服务处理多线程(替代使用工作队列处理启动请求),则可以继承Service类来处理各个Intent。

    2. IntentService:

      IntentService可完成如下任务:

      1)创建区别于应用程序主线程的默认工作线程来执行发送到onStartCommand()方法的全部Intent

      2)创建工作队列,每次传递一个Intent到 onHandleIntent()方法实现,从而不必担心多线程

      3)所有启动请求处理完毕后停止服务,不必调用stopSelf()方法

      4)提供onBind()方法的默认实现,返回值为null

      5)提供onStartCommand()方法的默认实现,它先发送Intent到工作队列,然后到 onHandleIntent()方法实现

      因此,开发者只需要实现onHandleIntent()方法来完成客户端提供的任务。

      实现IntentService类所必需的的全部操作:无参构造方法和onHandleIntent()方法。

  3. 创建Bound Service

    在实现绑定服务时,最重要的是定义onBind()回调方法返回的接口,有以下三种方式:继承Binder类、使用Messenger、使用AIDL

    1. 继承Binder类

      1)在服务中,创建 Binder类实例来完成下列操作之一:包含客户端能调用的公共方法、返回当前Service实例、返回服务管理的其它类的实例

      2)从onBind()回调方法中返回Binder类实例

      3)在客户端,从 onServiceConnected()回调方法接收Binder类实例,并且使用提供的方法调用绑定服务。

    2. 使用Messenger类

      使用 Messenger时需要注意:

      1)实现Handler的服务因为每次从客户端调用而收到回调

      2) Handler 用于创建 Messenger 对象(它是Handler的引用)

      3) Messenger 创建 IBinder,服务从onBind()方法将其返回到客户端

      4)客户端 使用 IBinder 来实例化 Messenger,然后用它来发送Message对象到服务

      5)服务在其Handler的handleMessage()方法接收Message

  4. 绑定到服务

    如果需要从客户端绑定到服务,需要完成以下操作:

    1)实现 ServiceConnection,这需要重写 onServiceConnected()和 onServiceDisconnected()两个回调方法

    2)调用 bindService()方法,传递ServiceConnection实现

    3)当系统调用onServiceConnected()回调方法时,就可以使用接口定义的方法调用服务

    4)调用 unbindService()方法解除绑定

  5. 管理 Service 的生命周期

Service 的生命周期

第14章网络编程及Internet应用

  1. 通过 HttpURLConnection访问网络

    创建 URL对象、通过URL. openConnection()获取HttpURLConnection对象,发送请求

    发送POST请求时常用的方法:

    setDoInput()、 setDoOutput()、 setUseCaches()、 setInstanceFollowRedirects()、 setRequestProperty()

  2. 使用HttpClient访问网络( Andorid 6.0之后已经移除

    HttpClient实际上是对Java提供的访问网路的方法进行了封装

    发送GET/POST请求大致可以分为以下几个步骤:

    1)创建HttpClient对象

    2)创建HttpGet/HttpPost对象

    3)如果需要发送请求参数,可以将参数连接到URL中,或调用HttpGet/HttpPost.setParams()方法

    4)调用HttpClient对象的execute()方法发送请求,返回一个HttpResponse对象

    5)调用HttpResponse对象的getEntity()方法,获得包含服务区响应内容的HttpEntity对象

  3. 使用WebView组件浏览网页

    1. WebView组件的常用方法:
      loadUrl()、loadData()、loadDataWithBaseURL()、goBack()、goForward()、stopLoading()、reload()

    2. 让WebView支持JavaScript
      WebView.getSettings.setJavaScriptEnabled(true);
      WebView.setWebChromeClient(new WebChromeClient());

第N章参考资料

  1. Android API
  2. Android 基础入门教程
  3. Android Online Training

发表评论

电子邮件地址不会被公开。