Android之架构师逆袭

第一章

一.什么是Android?

安卓(Android)是一种基于Linux的自由及开放源代码的操作系统。主要使用于移动设备,如智能手机平板电脑,由Google公司和开放手机联盟领导及开发,其中包含操作系统,中间件和核心应用等。

二.Android的平台架构。

1、Application 

    最上层是面向用户的Application(应用程序),包括电话程序、联系人程序、浏览器、地图、Email等。

2、Application Framework 

第二层是Application Framework,为开发人员提供访问核心组件所使用的API,包含了丰富的View组件、Content Providers(内容提供器)用来访问另一个应用程序的数据(如联系人),或者共享它们自己的数据、Resource Manager(资源管理器)提供对资源的访问(如本地字符串,图形,布局文件等)、Notification Manager(通知管理器)、Activity Manager(活动管理器)等。

3、Libraries 

    第三层是系统运行库,包含程序库和Android运行库。程序库中包含了一些C/C++库,通过应用框架为开发者提供服务,如:Libc(从BSD继承来的标准C系统函数库)、媒体库、SGL(2D图形引 擎)、3D libraries(基于OpenGL ES 1.0 APIs实现,可以使用硬件或软件3D加速)、SQLite(数据库引擎)等等。

4、Linux Kernel 

最下面一层是Linux核心,Android的核心系统依赖于Linux内核,如安全性、内存管理、进程管理、网络协议栈和驱动模型。 Android的 Linux kernel也不是GNU/Linux。Android将驱动程序移到userspace,使得Linux driver与Linux kernel分开。

三.搭建Android开发环境

1.下载JDK

下载安装——环境配置——用cmd检查是否安装成功

JDK在当初学习java的时候就已经安装过,所以这一步没有遇到什么问题。

2.下载安装SDK

SDK的安装用了老师给的安装包,也成功的进行了安装。

3.Android Studio 

4模拟器的安装

第二章

 

一、Android studio真机测试

1.手机连接到电脑上

2.打开开发者模式,打开USB调试选项,选择传输文件选项

3.电脑下载手机助手,在Android studio调试窗口找到自己的手机进行运行。代码运行成功之后,就可以在电脑手机助手上看到运行结果。

二、Android studio自带模拟器安装

1.点击 +create virtual Device,选择你想要设置的模拟器,这里我们选择phone手机的。

2.选择手机型号,不同的手机型号对应不同的大小和分辨率。

3.选择好手机型号之后选择API的版本。

4.完成,运行即可。

三、安卓程序的结构

1.安卓一个项目就是一个project,一个项目中可以包含多个app,一个module对应一个app。做开发时,只需建一个project,之后只需要建module即可。

2.Android项目结构

(Android视图下)

manifests ——  AndroidManifest.xml

配置文件,里面含有app的名称,版本号,过滤器(决定那个activity是入口)等,以及activity,一个activity就是一个页面。

 java —— com.example ——MainActivity

Java文件,所有的事件,操作。

res—— layout—— activity_main.xml

布局文件,负责界面设计。

可以在设计界面操作,也可以在代码界面。

res  ——drawable

在旧版本里大部分情况下存放图片。

res ——  mipmap

存放图片

(ps:总的来说,app图标(launcher icon) 必须放在mipmap目录中,并且最好准备不同分辨率的图片,否则缩放后可能导致失真;而应用内使用到的图片资源,放在drawable目录亦或是mipmap目录中是没有区别的,该准备多个分辨率的还是要准备多个分辨率,如果只想使用一份切图,那尽量将切图放在高密度的文件夹中。)

re—— values

关于颜色的定义:colors.xml

关于字符串的定义:strings.xml

关于样式的定义:styles.xml

 

Project 视图下

app/build/ app模块build编译输出的目录

app/build.gradle app模块的gradle编译文件

app/app.iml app模块的配置文件

app/proguard-rules.pro app模块proguard文件

build.gradle 项目的gradle编译文件

settings.gradle 定义项目包含哪些模块

gradlew 编译脚本,可以在命令行执行打包

local.properties 配置SDK/NDK

MyApplication.iml 项目的配置文件

External Libraries 项目依赖的Lib, 编译时自动下载的

四、Android UI设计

1..Android UI布局:布局管理器listview列表视图GridView网络视图

2..Android中提供了7种布局管理器:帧布局管理器水平线性布局管理器垂直线性布局管理器表格布局管理器表格行布局管理器网络布局管理器相对布局管理器

3..在一个Android应用程序中,用户界面通过view和viewgroup构造。Android中有很多种view和viewgroup,他们都继承自view类。

4..Android布局管理器可以很方便地控制各个组件的位置和大小,同时根据屏幕大小,管理容器内的控件,自动适配组件在手机屏幕中的位置。

 

第三章

 

一、帧布局管理器

1.FrameLayout(帧布局),这个布局直接在屏幕上开辟出一块空白的区域,当我们往里面添加控件的时候,会默认把他们放到这块区域的左上角,而这种布局方式却没有任何的定位方式,所以它应用的场景并不多;帧布局的大小由控件中最大的子控件决定,如果控件的大小一样大的话,那么同一时刻就只能看到最上面的那个组件!后续添加的控件会覆盖前一个!虽然默认会将控件放置在左上角,但是我们也可以通过layout_gravity属性,指定到其他的位置。

2.FrameLayout(帧布局)默认是按左上角(0,0)开始排布,在帧布局下的每一个控件都是以画面的形式进行呈现

最开始定义的控件出现在最下方,最后定义的控件出现在最上方,一般用于手机联系人的导航显示字母、帧动画等内容。

3.

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    <TextView 
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#00ff00"
        android:text="你好"/>
    <TextView 
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="30dp"
        android:background="#ff0000"
        android:text="页面"/>

</FrameLayout>

 

二、线性布局管理器

1. LinearLayout是Android控件中的线性布局控件,它包含的子控件将以横向(HORIZONTAL)或竖向(VERTICAL)的方式排列,按照相对位置来排列所有的子控件及引用的布局容器。超过边界时,某些控件将缺失或消失。因此一个垂直列表的每一行只会有一个控件或者是引用的布局容器。

2.LinearLayout线性布局的相关属性:

android:orientation

布局方向:"vertical"垂直线性布局,"horizontal"水平线性布局

android:id

为控件指定相应的ID

android:text

指定控件当中显示的文字,需要注意的是,这里尽量使用strings.xml文件当中的字符

android:grivity

指定控件的基本位置,比如说居中,居右等位置

android:textSize

指定控件当中字体的大小

android:background

指定该控件所使用的背景色,RGB命名法

android:width

指定控件的宽度

android:height

指定控件的高度

android:padding

指定控件的内边距,也就是说控件当中的内容

android:singleLine

如果设置为真的话,则将控件的内容在同一行当中进行显示

android:layout_weight

默认值为0,layout_weight属性可以控制各个控件在布局中的相对大小,线性布局会根据该控件layout_weight值与其所处布局中所有控件layout_weight值之和的比值为该控件分配占用的区域。

3.用XML方式实现线性布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/background"
    >
    <Button android:text="按钮1" android:id="@+id/button1"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"/>
    <Button android:text="按钮2" android:id="@+id/button2"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"/>

 

4.用Java代码实现线性布局

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        LinearLayout layout = new LinearLayout(this);// 创建现行布局管理器
        LinearLayout.LayoutParams params = new LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.MATCH_PARENT);// 设置线性布局参数
        layout.setOrientation(LinearLayout.VERTICAL);
        TextView txt = new TextView(this);
        LinearLayout.LayoutParams txtParams = new LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.WRAP_CONTENT);// 设置组件参数
        txt.setLayoutParams(txtParams);//将文本组件添加到线性布局当中
        txt.setText(Hello!);//设置文件组件的文本
        txt.setTextSize(20);//设置文本大小
        layout.addView(txt, txtParams);
        addContentView(layout, params);
    }
}

 

三、表格布局

1. TableLayout是采用表格的形式对控件的布局进行管理的,在TableLayout布局管理器之中,要使用TableRow进行表格的行控制,之后所有的组件要在TableRow中增加。

2. 表格布局相关属性

android:collapseColumns

设置指定的列为collapse,该列会被隐藏

android:shrinkColumns

设置指定的列为shrinkable,该列的宽度进行收缩,自适应父类容器的大小

android:stretchColumns

设置指定的列为stretch,该列会被拉伸,填充满表格的空白区域

四、相对布局

1.相对布局是通过相对定位的方式让控件出现在布局任意位置;在相对布局中如果不指定控件摆放的位置,那么控件都会被默认放在RelativeLayout的左上角。因此要先指定第一个控件的位置,再根据一个控件去给其他控件布局。

2.相对布局相关属性

  android:layout_centerHrizontal

水平居中 

 android:layout_centerVertical 

垂直居中 

 android:layout_centerInparent

 相对于父元素完全居中 

   android:layout_alignParentBottom

位于父元素的下边缘 

android:layout_below

 位于元素的下方 

android:layout_alignTop

该元素的上边缘和某元素的的上边缘对齐 

 android:layout_marginBottom

  底边缘的距离 

 

五、列表视图

1. ListView(列表视图)是Android中常用的UI组件之一,它将以垂直列表的形式列出要显示的列表项目。一般来说ListView都是和Adapter(适配器)一起配合使用,数组数据或者数据库数据都将通过Adapter把值传递给ListView组件。

2. Adapter实际上是UI组件和数据源之间的一座桥梁,Adapter把数据从数据源中得到后将传递给Adapter View(适配器视图),Adapter View则将数据呈现在如Spinner(列表选择框)、ListView(列表视图)、GrideView(网格视图)等UI组件中。实际上ListView、GrideView是Adapter View的子类,他们通常和一个Adapter在一起使用,Adapter负责收集外部数据,然后再把数据项以View的形式显示在界面上。

3. Android提供了好几种类型的Adapter,他们都是Adapter的子类,常用的Adapter类型有:ArraryAdapter(数组适配器)、Base Adapter(基本适配器)、CursorAdapter(游标适配器)、SimpleCursorAdapter(简单游标适配器)、SpinnerAdapter(列表适配器)和WrapperListAdapter(封装列表适配器)。不同的适配器将用于绑定不同类型的数据,比如ArraryAdapter就适合绑定数组数据。

4.  ListView(列表视图)的常用属


属性

描述

android:id

用于设置ListView的名称

android:divider

用于为ListView设置分割条,既可以用颜色分割,也可以用Drawable资源分割

android:dividerHeight

用于设置分割条的高度

android:entries

用于通过数组资源为ListView指定列表项

android:footerDividersEnabled

用于设置是否在footer view之前绘制分割条,默认为true,设置为false时,表示不绘制。需要通过ListView(列表视图)提供的addFooterView()方法为ListView(列表视图)添加footer view

 

六、网格视图

1. GridView(网格视图)是Android中常用的UI组件之一,它是按照行、列分布的方式来显示多个组件的,通常用于显示图片或图标等。

2. 网格视图常用属性

属性

描述

android:id

用于设置GridView的名称

android:columnWidth

用于设置列的宽度

android:gravity

用于设置对齐方式

android:horizontalSpacing

用于设置各元素之间的水平间距

android:numColumns

用于设置列数,其属性值通常大于1,如果值较大比如100或者为auto_fit,则将在可用空间中显示尽量多的列数。

android:stretchMode

用于设置拉伸模式,其中属性可以为:

none:不拉伸

spacingWidth:仅拉伸元素之间的间距

columnWidth:仅拉伸表格元素本身

spacingWidthUniform:表格元素本身、元素之间的间距一起拉伸

android:verticalSpacing

用于设置各元素之间的垂直间距

第四章

一、文本框TextView

  1. 用于在屏幕中显示文本,可以输入单行文本,也可以输入多行文本,还可以输入指定格式的文本(密码、电话号码、E_mail地址等)。
  2. TextView常用属性

属性

描述

android:id

用于设置文本框的名称

android:capitalize

用于设置输入英文字母是否自动变为大写字母

l   0表示不自动变为大写字母

l   1表示一句话的首字母自动变为大写字母

l   2表示每个单词的首字母自动变为大写字母

l   3表示所有字母自动变为大写字母

android:cursorVisible

当可以编辑时,光标是否显示

l   true表示光标显示

l   false表示光标不显示(默认值)

android:editable

如果设置为true,表示文本框可以进行编辑

android:fontFamily

用于设置文本框的字体样式

android:gravity

用于设置文本框的对齐方式,可选值有topleftrightcenter_verticalfill_verticalcenter_horizontalfill_horizontalcenterfillclip_verticalclip_horizontal等。这些属性值也可以同时设定,各属性值之间用竖线隔开。例如要指定组件靠右下角对齐,可以使用属性值right|bottom

android:hint

用于设置当文本框中文本内容为空时,默认显示的提示文本

android:inputType

用于指定当前文本框显示内容的文本类型,其可选值有textpasswordtextEmailAddressphonedate等,可以同时指定多个,使用“|”竖线隔开。

android:maxHeight

用于设置文本框的最大高度

android:maxWidth

用于设置文本框的最大宽度

android:minHeight

用于设置文本框的最小高度

android:minWidth

用于设置文本框的最小高度

android:password

用于设置当文本框可以编辑时,里面的文本是否显示为隐藏密码样式“.”,显示为true,不显示为false

android:phoneNumber

用于设置当文本框可以编辑时,里面的文本是否显示为电话号码样式,显示为true,不显示为false

android:text

用于指定文本框中显示的文本内容

android:textAllCaps

用于设置文本框中的英文字母是否全部变为大写字母,变成大写字母为true,不变成大写字母为false

android:textColor

用于设置文本框内文本的颜色,其属性值可以是"#rgb" "#argb" "#rrggbb" "#aarrggbb"

android:textColorHighlight

用于设置文本框内文本的颜色是否高亮

android:textColorHint

用于设置文本框提示信息的颜色,其属性值可以是"#rgb" "#argb" "#rrggbb" "#aarrggbb"

属性

描述

android:textIsSelectable

用于设置当文本框不可以编辑时,文本框中的文字是否可以被选中,true为可以,false为不可以

android:textSize

用于设置文本框中文本的字体大小,其属性由代表大小的数值和单位组成,其单位可以是pxptspin

android:textStyle

用于设置文本框中文本的样式,可以同时指定多个,使用“|”竖线隔开

l   0表示正常

l   1表示加粗

l   2表示斜体

    

二、编辑框EditText

 

  1. 用于在屏幕中显示文本输入框,可以输入单行文本,也可以输入多行文本,还可以输入指定格式的文本(密码、电话号码、E_mail地址等)。
  2. 编辑框常用属性

属性

描述

android:autoText

如果被选中表示对编辑框中的文本自动更正拼写错误

android:drawableBottom

用于在编辑框内文本的底端绘制指定图片,该图片可以是放在res/drawable目录下的图片,通过“@drawable/文件名(不包括文件的扩展名)”设置

android:drawableRight

用于在编辑框内文本的右侧绘制指定图片,该图片可以是放在res/drawable目录下的图片,通过“@drawable/文件名(不包括文件的扩展名)”设置

android:editable

用于设置编辑框是否能被编辑,默认值为true

android:text

用于设置编辑框中默认显示的文本

android:background

用于设置编辑框的背景图片,该图片可以是放在res/drawable目录下的图片,通过“@drawable/文件名(不包括文件的扩展名)”设置

android:contentDescription

用于设置编辑框的简单描述文字

android:id

用于设置编辑框的名称

android:onClick

用于设置单击事件响应方法的方法名

android:visibility

用于设置编辑框是否可见

 
 

三、自动填充文本框AutoCompleteView

 

  1. AutoCompleteTextView(自动填充文本框)用于实现允许用户输入一定的字符后,显示一个下拉菜单,供用户从中选着,当用户选择某个选项后,按用户选择自动填写文本框。
  2. 自动填充文本框常用属性

属性

描述

android:completionHint

用于为弹出的下拉菜单指定提示标题

android:completionHintView

用于设置弹出的下拉菜单底部信息的样式

android:completionThreshold

用于指定用户至少输入几个字符才会显示提示

android:dropDownAnchor

它的值是一个ViewID,指定后AutoCompleteTextView会在这个View下弹出自动提示

android:dropDownHeight

用于指定下拉菜单的高度

android:dropDownHorizontalOffset

用于指定下拉菜单与文本之间的水平偏移。下拉菜单默认与文本框左对齐

android:dropDownSelector

用于设置下拉菜单显示效果

android:dropDownVerticalOffset

用于设置下拉菜单与文本之间的垂直偏移。下拉菜单默认紧跟文本框

android:dropDownWidth

用于设置下拉菜单的宽度

android:popupBackground

用于设置下拉菜单设置背景

 
 

四、普通按钮Button

1.   Button(普通按钮)用于在UI界面上生成一个可以单击的按钮。当用户单击按钮时,将会触发一个onClick事件,可以通过为按钮添加的单击事件监听器指定所要触发的动作。

2.   普通按钮属性

 

属性

描述

android:autoText

如果被选中表示对按钮上显示的文本进行自动更正拼写错误

android:drawableBottom

用于在按钮上显示文本的低端绘制指定图片,该图片可以是放在res/drawable目录下的图片,通过“@drawable/文件名(不包括文件的扩展名)”设置

android:drawableRight

用于在按钮上显示文本的右侧绘制指定图片,该图片可以是放在res/drawable目录下的图片,通过“@drawable/文件名(不包括文件的扩展名)”设置

android:enabled

用于设置按钮是否可用

android:text

用于设置按钮上显示的文字

android:background

用于设置按钮的背景图片,该图片可以是放在res/drawable目录下的图片,通过“@drawable/文件名(不包括文件的扩展名)”设置

android:contentDescription

用于设置按钮的简单描述文字

android:id

用于设置按钮的名称

android:onClick

用于设置单击事件响应方法的方法名

android:visibility

用于设置按钮控件是否可见

 

五、图片按钮ImageButton

 

  1. 图片按钮和普通按钮的使用方法基本相同,只不过图片按钮有android:src属性,可以用来设置在按钮中显示的图片。与普通按钮一样,也需要为图片按钮添加单击事件监听器用于指定所要触发的动作。
  2. 图片按钮属性

属性

描述

android:adjustViewBounds

如果设置为trueImageButton将调整其边框以适应图片大小

android:baseline

用于设置ImageButton的基线

android:baselineAlignBottom

如果值为true表示图片的基线与按钮底部相对齐

android:cropToPadding

如果值为true表示ImageButton会剪切图片以适应内边距的大小

android:src

用于设置要显示的图片资源位置,该图片可以是放在res/drawable目录下的图片,通过“@drawable/文件名(不包括文件的扩展名)”设置

android:background

用于设置图片按钮的背景图片,该图片可以是放在res/drawable目录下的图片,通过“@drawable/文件名(不包括文件的扩展名)”设置

android:contentDescription

用于设置图片按钮的简单描述文字

android:id

用于设置按钮的名称

android:onClick

用于设置单击事件响应方法的方法名

android:visibility

用于设置按钮控件是否可见

 

六、复选框checkbox

 

  1. 在Android中,单选按钮和复选框都继承于普通按钮,因此,它们都可以直接使用普通按钮支持的各种属性和方法,与普通按钮不同的是,他们提供了可选中的功能。 在默认情况下,CheckBox(复选框)显示为一个方框图标,并且在该图标旁边放置一些说明文字。CheckBox可以进行多选设置,每一个复选框都提供“选中”和“不选中”两种状态。
  2. 复选框属性

属性

描述

android:autoText

如果被选中表示对复选框的说明文本自动更正拼写错误

android:drawableBottom

用于在复选框的说明文本的低端绘制指定图片,该图片可以是放在res/drawable目录下的图片,通过“@drawable/文件名(不包括文件的扩展名)”设置

android:drawableRight

用于在复选框的说明文本的右侧绘制指定图片,该图片可以是放在res/drawable目录下的图片,通过“@drawable/文件名(不包括文件的扩展名)”设置

android:editable

用于设置复选框的说明文本是否能被编辑,默认值为true

android:text

用于设置复选框的默认说明文本

android:background

用于设置复选框的背景图片,该图片可以是放在res/drawable目录下的图片,通过“@drawable/文件名(不包括文件的扩展名)”设置

android:contentDescription

用于设置复选框的简单描述文字

android:id

用于设置复选框的名称

android:onClick

用于设置单击事件响应方法的方法名

android:visibility

用于设置复选框是否可见

 

七、开关按钮ToggleButton

 

  1. ToggleButton(开关按钮)是Android中比较简单的一个控件,具有选中和为选中两个状态的按钮,并且需要为不同的状态设置不同的显示文本,同时还有一个显示开/关的指示灯。
  2. 开关按钮的属性

属性

描述

android:disabledAlpha

用于设置按钮在禁用时的透明度

android:textOff

用于设置开关按钮未被选中时的说明文本

android:textOn

用于设置开关按钮被选中时的说明文本

android:autoText

如果被选中表示对开关按钮的说明文本自动更正拼写错误

android:drawableBottom

用于在开关按钮的说明文本的低端绘制指定图片,该图片可以是放在res/drawable目录下的图片,通过“@drawable/文件名(不包括文件的扩展名)”设置

android:drawableRight

用于在开关按钮的说明文本的右侧绘制指定图片,该图片可以是放在res/drawable目录下的图片,通过“@drawable/文件名(不包括文件的扩展名)”设置

android:editable

用于设置开关按钮的说明文本是否能被编辑,默认值为true

android:text

用于设置开关按钮的默认说明文本

android:background

用于设置开关按钮的背景图片,该图片可以是放在res/drawable目录下的图片,通过“@drawable/文件名(不包括文件的扩展名)”设置

android:contentDescription

用于设置开关按钮的简单描述文字

android:id

用于设置开关按钮的名称

android:onClick

用于设置单击事件响应方法的方法名

android:visibility

用于设置开关按钮是否可见

 

 

八、单选按钮RadioButton

  1. 默认情况下,单选按钮显示为一个圆形图标,并且在该图标旁边放置一些说明文字,一般将多个单选按钮放置在RadioGroup(按钮组) 中,当用户选中其中某个RadioButton(单选按钮)后, RadioGroup(按钮组) 中其它按钮将被自动取消选中状态。
  2. 单选按钮基本属性

属性

描述

android:autoText

如果被选中表示对单选按钮的说明文本自动更正拼写错误

android:drawableBottom

用于在单选按钮的说明文本的低端绘制指定图片,该图片可以是放在res/drawable目录下的图片,通过“@drawable/文件名(不包括文件的扩展名)”设置

android:drawableRight

用于在单选按钮的说明文本的右侧绘制指定图片,该图片可以是放在res/drawable目录下的图片,通过“@drawable/文件名(不包括文件的扩展名)”设置

android:editable

用于设置单选按钮的说明文本是否能被编辑,默认值为true

android:text

用于设置单选按钮的默认说明文本

android:background

用于设置单选按钮的背景图片,该图片可以是放在res/drawable目录下的图片,通过“@drawable/文件名(不包括文件的扩展名)”设置

android:contentDescription

用于设置单选按钮的简单描述文字

android:id

用于设置单选按钮的名称

android:onClick

用于设置单击事件响应方法的方法名

android:visibility

用于设置单选按钮是否可见

 

 

九、ProgressDialog(进度对话框)类创建ProgressBar(进度条)

1.当一个应用程序在后台执行时,前台界面不会有任何信息,这时用户不知道程序是否在执行以及执行进度等信息,因此需要使用进度条来提示程序执行的进度。例如,当你从互联网上传或下载文件的时候,上传/下载进度条将显示下载进度信息。

Android中,可以使用ProgressDialog(进度对话框)类来创建ProgressBar(进度条)控件。

先用ProgressDialog类实例化一个对象来实现,语法如下:

 ProgressDialog progress = new ProgressDialog(this);

然后再设置ProgressDialog类的属性,如下所示:

     progress.setMessage("Downloading Music ! ");

     progress.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);

     progress.setIndeterminate(true);

2.进度条常用属性

 

方法

描述

getMax()

此方法将返回进度的最大值

incrementProgressBy(int diff)

此方法将设置增加的进度,每次推进的步伐

setIndeterminate(boolean indeterminate)

此方法将设置进度条是否为不确定模式

setMax(int max)

此方法将设置进度的最大值

setProgress(int value)

此方法将设置进度条的当前进度值

show(Context context, CharSequence title, CharSequence message)

这是一个静态方法,用于显示进度对话框

十、列表选项框

  1. Android中提供的Spinner(列表选择框)相当于在网页中常见的下拉列表框,通常用于提供一系列可选择的列表提供用户进行选择,从而方便用户。例如你使用电子邮件时,在菜单处你可以选择Reply(回复)、Reply all(回复全部)和Forward(转发)

十一、时间拾取器TimePicker

    1. 在Android中TimePicker(时间拾取器)是用于选择一天中时间的控件,在TimePicker中可以设置小时、分钟和AM/PM(上午/下午)。
      2.时间拾取器属性

方法

描述

is24HourView()

此方法将返回当前TimePicker是否以24小时显示的状态

isEnabled()

此方法将返回当前TimePicker是否可用的状态

setCurrentHour(Integer currentHour)

此方法将设置TimePicker中显示的当前小时数

setCurrentMinute(Integer currentMinute)

此方法将设置TimePicker中显示的当前分钟数

setEnabled(boolean enabled)

此方法将设置TimePicker是否可用

setIs24HourView(Boolean is24HourView)

此方法将设置是否以24小时模式显示时间

setOnTimeChangedListener(TimePicker.OnTimeChangedListener onTimeChangedListener)

此方法将用于监听事件改变时触发的事件


                      

 

  1. 系统自带的文字外观设置:
    android:attr/textAppearanceButton
    android:attr/textAppearanceSmall
    android:attr/textAppearanceMedium android:attr/textAppearanceLarge
    android:attr/textAppearanceInverse
    android:attr/textAppearanceSmallInverse
    android:attr/textAppearanceMediumInverse android:attr/textAppearanceLargeInverse

 

十二、日期拾取器

    1. 在Android中,DatePicker(日期拾取器)是让用户在界面中选择日期的控件。在DatePicker由年、月、日三部分组成。Android提供DatePicker控件和调用DatePickerDialog(日期拾取器对话框)类两种方式以实现日期选取功能。
    2. 日期拾取器常用属性

方法

描述

getDayOfMonth()

此方法将返回当前DatePicker中的天数值

getMonth()

此方法将返回当前DatePicker中的月份值

getYear()

此方法将返回当前DatePicker中的年

setMaxDate(long maxDate)

此方法将设置DatePicker所支持的最大日期数

setMinDate(long minDate)

此方法将设置DatePicker所支持的最小日期数

setSpinnersShown(boolean shown)

此方法将设置DatePicker是否显示下拉选择框

getCalendarView()

此方法将返回calendar view

getFirstDayOfWeek()

此方法将返回一周的第一天是星期几

updateDate(int year, int month, int dayOfMonth)

此方法将通过参数更新DatePicker的现有时间

 

第五章

一、基本程序单元Activity

  1. 在Android中,Activity(活动)表示一个单一屏幕上的用户界面。例如,电子邮件应用程序主界面可能是一个Activity,显示新的电子邮件列表则是另一个Activity,撰写电子邮件又是其它的Activity。如果应用程序有一个以上的Activity,则应该在AndroidManifest.xml配置文件中将其中一个Activity标记为启动Activity以开启应用程序。Android系统是是从MainActivity的onCreate( )方法调用开始启动程序的。
  2. Activity生命周期中的回调方法

 

回调方法

描述

onStart()

在创建Activity时被调用。该方法是最常见的方法,在Android Studio创建项目时,会自动创建一个MainActivity,在该MainActivity中,默认重写了onCreate(Bundle savedInstanceState)方法,用于对该Activity进行初始化。

onResume()

启动Activity时被回调,也就是当一个Activity变为显示时被回调。

onPause()

Activity由暂停状态恢复为活动状态时调用。调用该方法后,该Activity位于Activity堆栈的栈顶。该方法总是在onPause()方法以后执行。

onStop()

暂停Activity时被调用。该方法需要被非常快地执行,应用直到该方法执行完毕后,下一个Activity才能被恢复。该方法通常用于保存数据。比如,当我们在玩游戏时,突然来了一个电话,这是在该方法中保存运行状态的数据。

onDestroy()

停止Activity时被回调。

onRestart()

销毁Activity时被回调。

onCreate()

重新启动Activity时被回调,该方法总是在onStart()方法后被执行。

 

二、Android应用核心IntentFilters

  1. 在Android中,Intent(意图)是一个将要执行操作的抽象描述。Android的3个核心组件Activity(活动)、Service(服务)和BroadcastReceiver(广播接收器)都需要使用Intent来进行激活。Intent用于相同或者不同应用程序组件间的后期运行时绑定。
  2. 对于不同的组件,Android系统提供了不同的Intent启动方法:

 

组件类型

启动方法

Activity

startActivity(Intent intent)

startActivityForResult(Intent intent, int requestCode)

Service

ComponentName StartService(Intent service)

Boolean bindService(Intent service, ServiceConnection conn, int flags)

BoradcastReceiver

sendBoradcast(Intent intent)

sendBoradcast(Intent intent, String receiverPermission)

sendOrderedBoradcast(Intent intent, String receiverPermission, BroadcastReceiver resultReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)

sendOrderedBroadcast(Intent intent, String receiverPermission)

sendStickyBroadcast(Intent intent)

sendStickyOrderedBroadcst(Intent intent, BroadcstReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)

 

    1. Intent的各属性
      Intent对象中包含了接收该Intent的组件感兴趣的信息(如执行的操作和操作的数据)和Android系统感兴趣的信息(如处理该Intent的组件的类别和任何启动目标Activity的说明)。Intent对象大致包含Component(组件)、Action(动作)、Category(类别)、Data(数据)、Type(类型)、Extra(额外)和Flag(标记)等属性,下面详细介绍Intent对象各属性的作用。
    2. Component(组件)
      Intent的Component(组件)内容需要接受一个ComponentName(组件名称)属性,ComponentName属性包含以下几个构造器:

 

构造器

描述

ComponentName(String pkg, String cls)

创建pkg所在包下的cls类所对应的组件

ComponentName(Context pkg, String cls)

创建pkg所对应的包下的cls类所对应的组件

ComponentName(context pkg, Class<?> cls)

创建pkg所对应的报下的cls类所对应的组件

 

上面的构造器的本质就是一个,这说明创建一个ComponentName需要指定包名和类名(可唯一地确定的组件类),这样应用程序就可根据给定的组件类去启动特定的组件。

 

除此之外,Intent(意图)还包含如下三个方法:

 

方法

描述

setClass(Context packageContext, Class<?> cls)

设置该Intent将要启动的组件的类

setClassName(Context packageContext, String className)

设置该Intent将要启动的组件对应的类名

setClassName(String packageName, String className)

设置该Intent将要启动的组件对应的类名

    1. Action(动作)
      Action(动作)是一个字符串,用来表示要完成的一个抽象动作。这个动作具体由哪个组件(或许是Activity、或许是BroadcastReceiver)来完成,Action这个字符串本身并不管。需要指出的是,一个Intent对象最多只能包括一个Action属性,在Android定义了一系列动作常量,其目标组件包括Activity和BroadcastReceiver两类。下面分别进行介绍。
      表中列出了当前Intent类中定义的用于启动Activity的标准动作,其中最常用的是ACTION_MAIN和ACTION_EDIT。

Action常量

对应字符串

描述

ACTION_MAIN

Android.intent.action. MAIN

应用程序入口

ACTION_VIEW

Android.intent.action. VIEW

显示指定数据

ACTION_ATTACH_DATA

Android.intent.action. ATTACH_DATA

指定某块数据将被附加到其他地方

ACTION_EDIT

Android.intent.action. EDIT

编辑指定数据

ACTION_PICK

Android.intent.action. PICK

从列表中选择某项,并返回所选的数据

ACTION_CHOOSER

Android.intent.action. CHOOSER

显示一个Activity选择器

ACTION_GET_CONTENT

Android.intent.action. GET_CONTENT

让用户选择数据,并返回所选数据

ACTION_DIAL

Android.intent.action. DIAL

显示拨号面板

ACTION_CALL

Android.intent.action. CALL

直接向指定用户打电话

ACTION_SEND

Android.intent.action. SEND

向其他人发送数据

Action常量

对应字符串

描述

ACTION_SENDTO

Android.intent.action. SENDTO

向其他人发送信息

ACTION_ANSWER

Android.intent.action. ANSWER

应答电话

ACTION_INSERT

Android.intent.action. INSERT

插入数据

ACTION_DELETE

Android.intent.action. DELETE

删除数据

ACTION_RUN

Android.intent.action. RUN

运行数据

ACTION_SYNC

Android.intent.action. SYNC

执行数据同步

ACTION_PICK_ACTIVITY

Android.intent.action. ACTIVITY

用于选择Activity

ACTION_SEARCH

Android.intent.action. SEARCH

执行搜索

ACTION_WEB_SEARCH

Android.intent.action. WEB_SEARCH

执行Web搜索

ACTION_FACTORY_TEST

Android.intent.action. FACTORY_TEST

工厂测试的入口

    1. 标准接收广播动作
      表中列出来当前Intent类中定义的用于接收广播的标准动作。

Action常量

对应字符串

ACTION_TIME_TICK

Android.intent.action. TIME_TICK

ACTION_TIME_CHANGED

Android.intent.action. TIME_CHANGED

ACTION_TIMEZONE_CHANGED

Android.intent.action. TIMEZONE_CHANGED

ACTION_BOOT_COMPLETED

Android.intent.action. BOOT_COMPLETED

ACTION_PACKAGE_ADDED

Android.intent.action. PACKAGE_ADDED

ACTION_PACKAGE_CHANGED

Android.intent.action. PACKAGE_CHANGED

ACTION_PACKAGE_REMOVED

Android.intent.action. PACKAGE_REMOVED

Action常量

对应字符串

ACTION_PACKAGE_RESTARTED

Android.intent.action. _PACKAGE_RESTARTED

ACTION_PACKAGE_DATA_CLEARED

Android.intent.action. PACKAGE_DATA_CLEARED

ACTION_UID_REMOVED

Android.intent.action. UID_REMOVED

ACTION_BATTERY_CHANGED

Android.intent.action. BATTERY_CHANGED

ACTION_POWER_CONNECTED

Android.intent.action. POWER_CONNECTED

ACTION_POWER_DISCONNECTED

Android.intent.action. POWER_DISCONNECTED

ACTION_SHUTDOWN

Android.intent.action. SHUTDOWN

 

7. Category(类别)

Category(类别)也是一个字符串,它用于为Aciton增加额外的附加类别信息。

 

 

addCategory(string str)方法将为Intent添加Category,removeCategory()方法删除上次增加的Category,getCategory()方法获得当前对象中包含的全部Category。

8. Data(数据)和Type(类型)

Data(数据)通常用于想Action属性提供操作的数据。Data接受一个URI对象,一个URI对象通常通过如下形式的字符串来表示:

content://com.android.contacts/contacts/1

tel:123

URI字符串通常是如下格式:

scheme://host:port/path

Type(类型)用于指定该Data所指定URI对应的MIME类型,这种MIME类型可以是任何自定义的MIME类型,只要符合abc/xyz格式的字符串即可。

Data和Type的关系比较微妙,这两个属性会相互覆盖,例如:

 如果为Intent先设置Data,后设置Type,那么Type属性将会覆盖Data属性。

 如果为Intent先设置Type,后设置Data,那么Data属性将会覆盖Type属性。

 如果希望Intent既有Data属性,也有Type属性,需要调用Intent的setDataAndType()方法。

在AndroidManifest.xml配置文件中为组件声明Data、Type属性都通过<data…/>标签,<data…/>标签的格式如下:

<data android:mimeType=” ”

android:scheme=” ”

android:host=” ”

android:port=” ”

android:path=” ”

android:pathPrefix=” ”

android:pathPattern=” ” />

上面的<data…/>标签支持如下属性。

 mimeType:用于声明该组件所能匹配的Intent的Type属性。

 scheme:用于声明该组件所能匹配的Intent的scheme部分。

 host:用于声明该组件所能匹配的Intent的Data属性的host部分。

 port:用于声明该组件所能匹配的Intent的Data属性的port部分。

 path:用于声明该组件所能匹配的Intent的Data属性的path部分。

 pathPrefix:用于声明该组件所能匹配的Intent的Data属性的path前缀。

 pathPattern:用于声明该组件所能匹配的Intent的Data属性的path字符串模板。

9. Flag(标记)

Intent的Flag(标记)属性用于为该Intent添加一些额外的控制标记,Intent可调用addFlags()方法来为Intent添加控制标记。Intent中常用的Flag如下:

 

FLAG_ACTIVITY_BROUGHT_TO_FRONT

如果通过该标记启动的Activity已经存在,下次在启动时,将只是将该该Activity带到前台

 

FLAG_ACTIVITY_CLEAR_TOP

该标记相当于加载模式中的singleTask,通过这种Flag启动的Activity将会把要启动的Activity之上的Activity全部弹出Activity

 

FLAG_ACTIVITY_NEW_TASK

默认的启动标记,该标记控制重新创建一个新的Activity

 

FLAG_ACTIVITY_NO_ANIMATION

该标记会控制启动Activity时不实用过渡动画

 

FLAG_ACTIVITY_NO_HISTORY

该标记控制被启动的Activity将不会保留在Activity栈中

 

FLAG_ACTIVITY_REORDER_TO_FRONT

该标记控制如果当前已有该Activity,直接将该Activity带到前台

 

FLAG_ACTIVITY_SINGLE_TOP

该标记相当于加载模式中的singleTop模式

 


10、Intents的类型

1).Android中,Intent分为显式Intent和隐式Intent

  • 显式Intent是指定了Component(组件)属性的Intent,它已经明确了将启动哪个组件。例如,你打算从一个Activity中通过点击按钮启动另一个Activity,如图所示一样。

 

  • 隐式Intent是没有指定Component(组件)属性的Intent,由于隐式Intent没有明确指定要启动哪个组件,应用程序将会根据Intent指定的规则去启动符合条件的组件,但具体是哪个组件则不确定(系统自动选择适合的组件执行Intent)。

11.Intent Filters(意图过滤器)
1).Activity、Service和BroadcastReceiver能定义多个Intent过滤器来通知系统它们可以处理哪些隐式Intent。每个过滤器描述组件的一种能力以及该组件可以接收的一组Intent。实际上,过滤器接收需要类型的Intent,拒绝不需要类型的Intent仅限于隐式Intent。对于显式Intent,无论内容如何,总可以发送给目标,过滤器不干预。
2).过滤器使用<intent-filter…/>标签在配置文件AndroidManifest.xml中进行注册,它是<activity…/>标签的子元素,<activity…/>标签用于为应用程序配置Activity, <activity…/>的<intent-filter…/>标签则用于配置该Activity所能“响应”的Intent。
<intent-filter…/>标签里通常包含如下子标签。
 0~N个<action…/>子标签
 0~N个<category…/>子标签
0~1个<data…/>子标签
3).那么如果一个Intent可以通过多个Activity或Service的标签,系统到底会调用那一个Activity或Service组件来执行这个Intent呢?
Android系统会通过如下的测试来决定调用哪一个组件:
 标签可以列有多个<action…/>子标签,系统会选择其中最匹配的动作来调用Activity。但<action…/>子标签不能缺省,即过滤器必须包含至少一个<action…/>子标签,否则会阻塞所有Intent.
 标签可以列0个、1个或多个<category…/>子标签。0个表示Intent总是可以通过该项测试。1个或多个表示Intent类别必须和每一种类别相匹配才能通过测试。需要注意的是,Android默认所有通过startActivity()方法传递的隐式Intent包含一个默认类型android.intent.category.DEFAULT(CATEGORY_DEFAULT常量),因此,接收隐式Intent的Activity必须在过滤器中包含android.intent.category.DEFAULT相与之匹配。
 标签可以列0个、1个或多个< data …/>子标签。每个< data …/>子标签可以指定URI和数据类型(MIME媒体类型)。URI可以分成scheme、host、port和path几个独立的部分。Intent对象的URI和数据类型两部分都要和过滤器的URI和数据类型相互匹配才能通过测试匹配规则如表4.9所示。

 

Intent对象

过滤器

通过条件

URI

数据类型

URI

数据类型

 

未指定

未指定

未指定

未指定

无条件通过

指定

未指定

指定

未指定

两个URI匹配

未指定

指定

未指定

指定

两个数据类型匹配

指定

指定

指定

指定

URI和数据类型匹配

 

三、Android事件处理

    1. 不管是桌面应用还是手机应用程序,面对最多的就是用户,经常需要处理的就是用户动作,也就是需要为用户动作提供响应,这种为用户提供响应的机制就是事件处理。
    2. 关于Android时间管理的三个基本概念:
       事件监听器:事件监听器就是包含有一个回调方法的View(视图)类接口,它负责监听UI界面上的View(视图)类(控件)发生的各种事件,并对事件作出相应的响应。
       事件监听器注册:事件监听器注册就是事件监听器与一个事件处理程序相绑定,当事件发生时,监听器侦测到事件后交由与其绑定(注册)的事件处理程序做响应处理。
       事件处理程序:当事件发生时,事件监听器将调用与其绑定(注册)的事件处理程序以处理事件。事件处理程序中包含有处理事件的实例方法。

事件处理程序

事件监听器

onClick()

OnClickListener()

当用户单击、触摸或把焦点放到诸如按钮、文本或图片等控件上时,它将调用onClick()事件处理程序来响应该事件。

onLongClick()

OnLongClickListener()

当用户点击、触摸或把焦点放到诸如按钮、文本或图片等控件时间超过1秒时,它将调用onLongClick()事件处理程序来响应该事件。

onFocusChange()

OnFocusChangeListener()

当控件失去焦点时,它将调用onFocusChange()事件处理程序来响应该事件。

onTouch()

OnTouchListener()

当用户按下硬件按键、松开硬件按键或在屏幕上做任何手势时,它将调用onTouch()事件处理程序来响应该事件。

onMenuItemClick()

OnMenuItemClickListener()

当用户选中一个菜单项时,它将调用onMenuItemClick()事件处理程序来响应该事件。

 

    1. 注册事件监听器的方法
      事件监听器注册就是事件监听器与一个事件处理程序相绑定。注册方法有很多种,但最常用的方法有以下三种:
       使用匿名内部类
       Activity类执行Listener(监听器)接口
       在布局文件activity_main.xml中直接指定事件处理程序(方法)

 

第六章

一、Service(服务)

是能够在后台执行长时间运行操作而且不提供用户界面的应用程序组件。例如,Service能在后台播放音乐、处理网络事务或执行文件输入/输出等操作。Service也是在Android四大组件中与Activity最相似的组件,它们都代表可执行的程序,Service与Activity的区别在于,Service一直在后台运行,没有用户界面,所以绝对不会到前台来。

二、Service的分类

 

状态

描述

Started(启动)

当应用程序组件(如Activity)通过调用startService()方法启动服务时,服务处于started状态。一旦启动,Service能在后台无限期地运行,即使启动它的组件已经被销毁。例如,Service通过网络网络下载或者上传文件。如果操作完成,Service需要停止自身。

Bound(绑定)

当应用程序组件通过调用bindService()方法绑定到Service时,服务处于bound状态。绑定Service提供客户端/服务器接口,以允许组件与服务交互、发送请求、获得结果,甚至使用进程间通信(IPC)跨进程完成这些操作。仅当其它应用程序与Service绑定时,绑定服务才运行。多个组件可以一次绑定到一个Service上,当它们都解绑时,Service被销毁。

三、Service的生命周期

ServiceActivity一样具有自己的生命周期。通过生命周期中的回调方法,你可以监视Service的状态变化。随着应用程序启动Service的方式不同,Service的生命周期也略有差异。

如果应用程序通过startService()方法启动ServiceService的生命周期如图6.1左边所示。

如果应用程序通过bindService()方法启动ServiceService的生命周期如图6.1右边所示

 

 

四、Service生命周期中的回调方法

        为了创建Service,你需要创建一个Service类的子类。在实现类中,需要重写一些处理服务生命周期的回调方法,并根据需要提供组件绑定到服务的机制。需要重写的重要回调方法如表6.2所示。

 

 

回调方法

描述

onStartCommand()

当其他组件(如Activity)调用startService()方法启动该Service时,系统都会回调该方法。如果任务完成需要停止服务,可以通过stopSelf()stopService()方法实现。

onBind()

当其他组件(如Activity)调用bindService()方法想与Service绑定时,系统调用该方法。在该方法的实现中,开发人员必须通过返回IBinder对象来提供其他组件与Service通信的接口。该方法必须实现,但是如果不想绑定,则需返回null

onUnbind()

当该Service上绑定的所有其他组件都断开连接时将会回调该方法。

onRebind()

当该Service和旧组件之间的所有的绑定在onUnbind()里面全都结束之后,如果一个新的组件要绑定到该Service,就会启动该方法。

onCreate()

当该Service第一次被创建后将立即回调该方法。如果Service已经运行,该方法不被调用。

onDestroy()

当该Service被关闭之前将会回调该方法。

 

第七章

一、Android广播接收器

1.Broadcast Receiver(广播接收器)也是Android系统四大组件之一,这种组件本质上就是一个全局的监听器,用于监听系统全局的广播信息。这些信息就是程序(包括用户开发的程序和系统内建的程序)所发出的Broadcast Intent(广播意图)。比如,当从网上下载数据完成后,应用程序可以发出广播信息通知其他程序,数据已经下载完成并可以使用了。这时,Broadcast Receiver可以监听到这个信息并采取对应的行动。

2.我们需要通过以下两步来创建Broadcast Receiver,并使其响应与之相配的系统Broadcast Intent:

创建Broadcast Receiver

注册Broadcast Receiver

也有可能在以上两步之间增加一个步骤,就是当执行用户自定义Broadcast Intent时,你需要创建这个自定义Intent然后将其与Broadcast Receiver注册。

二、创建Broadcast Receiver

    1. 我们可以通过创建一个Broadcast Receiver子类的方法来创建一个广播接收器。然后再重写它的onReceive()方法,将Intent作为其参数来传递消息
    2. 一旦实现了Broadcast Receiver,接下来就应该指定该Broadcast Receiver能匹配的Intent,这就是注册Broadcast Receiver,如图。注册Broadcast Receiver又需要考虑以下两种情况:
      接收用户自定义Broadcast Intent消息
      接收系统广播消息

 

 

三、接收用户自定义Broadcast Intent消息

 

  1. 如果你的应用程序组件(如Activity)生成一个自定义Broadcast Intent,你可以通过sendBroadcast()方法将其发送出去,例如如下代码:
    Intent intent = new Intent();
    intent.setAction("com.example.CUSTOM_INTENT");
    sendBroadcast(intent);
  2. 每次Broadcast事件发生后,系统就会创建对应的Broadcast Receiver实例,并自动触发它的onReceive()方法,onReceive()方法执行完后,Broadcast Receiver实例就会被销毁。
    如果Broadcast Receiver的onReceive()方法不能在10秒内执行完成,Android就会认为该程序无响应。所以不要在Broadcast Receiver的onReceive()方法中执行一些耗时的操作,否则会弹出程序无响应对话框。如果确实需要根据Broadcast来完成一项比较耗时的操作,则可以考虑通过Intent启动一个Service来完成该操作。
    四、接收系统广播消息
    1. 除了接收用户发送的广播之外,Broadcast Receiver还有一个重要的用途:接收系统广播。如果应用程序需要在系统特定时刻执行某些操作,就可以通过监听系统广播来实现,。注册监听系统广播的Broadcast Receiver,需要在AndroidManifest.xml文件中对与系统广播Action常量匹配的Broadcast Receiver进行注册。
    2. Android的大量系统事件都会对外发送标准广播。Android常见的广播Action常量如表

广播Action常量

描述

android.intent.action.BATTERY_CHANGED

电池电量改变的广播

android.intent.action.BATTERY_LOW

电池电量低的广播

android.intent.action.BATTERY_OKAY

表示电池电量充足,即从电池电量低变化到饱满时会发出广播

android.intent.action.BOOT_COMPLETED

当系统启动完成后,这个动作被广播一次(只有一次)

android.intent.action.SCREEN_ON

当屏幕被打开之后时的广播

android.intent.action.CALL

当用户根据指明的信息向某人拨打电话时的广播

android.intent.action.CALL_BUTTON

当用户点击拨号按钮时的广播

android.intent.action.DATE_CHANGED

当系统日期被改变时的广播

android.intent.action.REBOOT

当系统重启时的广播

第八章

一、ContentProvider概述

  1. 当系统中部署越来越多的Android应用后,有时候就需要在不同的应用之间共享数据,比如现在有一个短信接收应用,用户想把接收到的短信的发送人添加到联系人管理应用中,就需要在不同应用之间共享数据。对于这种需求,操作方法有很多种,比如SharedPreferences、文件或数据库等直接去操作另一个应用程序所记录的方式。但这种方式显得太杂乱,因为不同的应用程序记录数据的方式差别太大,不利于应用程序之间进行数据交换。
  2. 为了在应用程序之间交换数据,Android提供了ContentProvider,ContentProvider是不同应用程序之间进行数据交换的标准API,当一个应用程序需要把自己的数据交给其他应用程序使用时,该应用程序就可通过ContentProvider来实现;其他应用程序可以通过ContentResolver来操作ContentProvider提供的数据。ContentProvider也可以把数据保存在数据库、文件甚至网络中,ContentProvider工作模式如图所示。

 

    1. 一旦某个应用程序通过ContentProvider共享了自己的数据操作接口,那么不管该应用程序是否启动,其他应用程序都可以通过该接口来操作共享出来的内部数据。ContentProvider提供了insert()(增加数据)、update()(修改数据)、delete()(删除数据)和query()(查询数据)等数据操作方法。
      创建一个自定义的ContentProvider类可以通过继承Android提供的ContentProvider基类来实现,例如如下代码:
      public class My Application extends  ContentProvider {}
      ContentProvider也是Android应用的四大组件之一,它与Activity、Service和BroadcastReceiver相似,都需要在AndroiManifest.xml文件中进行注册。
    2. 注册ContentProvider时通常指定如下属性。

 

属性

描述

name

指定该ContentProvider的实现类的类名

authorities

指定该ContentProvider对应的URI

enabled

指定该ContentProvider是否可用

exported

指定该ContentProvider是否允许其他应用调用

 

二、URI简介

1.每个ContentProvider都需要提供公共的URI来唯一标识其数据集。管理多个数据集的ContentProvider为每个数据集提供了单独的URIURI的基本格式如下

<prefix>://<authority>/<data_type>/<id>

例如 content://com.example.provider.college /people/2

<prefix>

标准的前缀,始终设为content://

<authority>

指定ContentProvider的名称。例如contactsbrowser等(系统ContentProvider)。对于第三方应用,该部分应该是完整的ContentProvider类名,例如com.example.provider.college

<data_type>

指定ContentProvider的被请求数据的路径。例如你需要从contacts这个系统ContentProvider中查询所有联系人,那么URIcontent://contacts/people

<id>

被请求的特定记录的id值。例如你需要从contacts这个系统ContentProvider中查询第5个联系人,那么URIcontent://contacts/people/5

 

三、创建ContentProvider

1.创建ContentProvider只需要如下两步:

像前面提到的一样,创建一个自定义的ContentProvider类可以通过继承Android提供的ContentProvider基类来实现。

在AndroidManifest.xml文件中注册该ContentProvider,指定android:authorities属性:也就是为ContentProvider绑定一个URI。

在上面两步中,自定义ContentProvider子类实现的insert()(增加数据)、update()(修改数据)、delete()(删除数据)和query()(查询数据)方法并不是给该应用本身调用的,而是供其他应用来调用的。当其他应用通过ContentResolver调用update()(修改数据)、delete()(删除数据)和query()(查询数据)方法执行数据访问时,实际上就是调用指定URI对应的ContentProvider的update()(修改数据)、delete()(删除数据)和query()(查询数据)方法。

2. ContentProvider子类中的重写方法

 

重写方法

描述

onCreate()

ContentProvider开始时,该方法被调用

query()

该方法接收客户端查询请求,结果返回一个Cursor对象

insert()

该方法为ContentProvider添加一条新记录

delete()

该方法从ContentProvider中删除一条记录

update()

该方法修改一条ContentProvider记录

getType()

该方法将返回给定URI指向数据的MIME类型

第九章

一、常用绘图类

 

    1. 在Android中,许多组件都是View的子类,所以在绘图时应当继承View类,并重写其中的指定方法onDraw(Canvas canvas),当你想展示特定的图形或者设定图形的特效时,在绘制时,需要具备4个基本组件:Bitmap类保存像素,Canvas类保存绘图的回调结果(在bitmap中要绘制的内容),通用绘图图元(例如:Rect、Path、text、Bitmap)以及Print类(用来设置颜色以及绘图的风格)。
      Android中的常用绘图类包括以下几个:
      android.graphics.Bitmap: 代表一张位图,所包含的图片可以由程序创建或者来自文件。
      android.grapics.Canvas: 表示画布,可以通过设置画布的属性,如颜色或者尺寸等,画出你想画的东西。
      android.grapics.Paint: 代表画笔,用来描述绘制图形的风格,例如设置颜色、线宽、透明度等属性,使用该类时,可以通过该类提供的构造方法创建对象。
      2.在一般的绘图操作中,Canvas类提供了一些常用的绘图方法,比如画圆形、正方形、长方形、椭圆形,这些方法可以直接画出这些图形。Canvas提供了如表所示的绘图方法。

返回类型

方  法

简  述

boolean

clipRegion(Region region)

裁剪指定区域

clipRect(int left, int top, int right, int bottom)

裁剪一个矩形区域

void

drawPoint(float x, float y, Paint paint)

绘制一个点

drawPoints(float[] pts, int offset, int count, Paint paint)

绘制多个点

drawLine(float startX, float startY, float stopX, float stopY, Paint paint)

绘制一条线

drawLines(float[] pts, int offset, int count, Paint paint)

绘制多条线

drawText(String text, float x, float y, Paint paint)

绘制字符串

drawRect(float left, float top, float right, float bottom, Paint paint)

绘制矩形

drawRoundRect(RectF rect, float rx, float ry, Paint paint)

绘制圆角矩形

drawOval(float left, float top, float right, float bottom, Paint paint)

绘制椭圆

drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint)

绘制弧

drawPaint(Paint paint)

在画布上绘满位图

drawPath(Path path, Paint paint)

沿着指定Path绘制任意形状

drawBitmap(Bitmap bitmap, float left, float top, Paint paint)

在指定坐标绘制位图

drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint)

在指定坐标绘制从源位图中挖取的一块

drawCircle(float cx, float cy, float radius, Paint paint)

在指定坐标绘制圆形

drawColor(int color)

用指定的颜色填充满位图

drawRGB(int r, int g, int b)

用指定的颜色RGB填充满位图

drawARGB(int a, int r, int g, int b)

用指定的颜色ARGB填充满位图

 

 

  1. 在使用Canvas类进行绘图时,还需要结合Paint类,Paint代表了Canvas上的画笔,用于绘图属性的设置,Paint提供了如表所示的绘图方法。

返回类型

方  法

简  述

boolean

setARGB(int a,int r,int g,int b)

设置颜色,参数值分别表示透明度、红色、绿色和蓝色值

setAlpha(int a)

设置透明度

setColor(int color)

设置颜色

setAntiAlias(boolean aa)

设置是否使用抗锯齿功能

setDither(boolean dither)

设置是否使用图像抖动处理

setPathEffect(PathEffect effect)

设置绘制路径时的路径效果

setShader(Shader shader)

设置渐变

setShadowLayer(float radius,float dx,float dy,int color)

设置阴影

setStyle(Paint.Style style)

设置画笔的样式风格

setStrokeCap(Paint.Cap cap)

设置笔刷的图形样式

setStrokeWidth(float width)

设置笔刷的宽度

 

 

二、绘制2D图形

1.在重写onDraw()方法时,可以通过调用一些方法绘制基础的2D图形,下面详细介绍Android中绘制简单的2D图形用到的方法。

点:drawPoint(float x,float y,Paint paint):在指定点绘制一个点。

直线:drawLine(float startx,float starty,loat stopx,float stopy,Paint paint):在点 (startx,starty) 和点 (stopx,stopy) 之间绘制一条直线。

矩形:drawRect(float x1,float y1,float x2,float y2,Paint paint):绘制左上角顶点为 (x1,y1), 右下角顶点为 (x2,y2) 的矩形。

多边形:drawVertices(VertexMode mode,int count,float[] pts,0,null,0,null,0,null,0,0,Paint paint):绘制一个多边形,其中 count 为坐标的个数,等于 pts 的大小。

圆:drawCircle(float cx,float cy,float r,Paint paint):绘制一个以 (cx,cy) 为圆心, r 为半径的圆。

弧线:drawArc(Rect rect,float startAngle,float sweepAngle,bool useCenter,Paint paint):在矩形 rect 内部 ( 此矩形并不会绘制 ) 绘制一个起始角度为 startAngle ,结束角度为 sweepAngle 的弧, useCenter 将决定这段弧是否会显示起点与终点的连线。

文字:drawText(String s, float x, float y, Paint paint):在 (x,y) 处绘制字符串s。

三、位图操作

 

  1. 学会如何绘制图像后,懂得图像处理也是至关重要的。Bitmap类,即位图,是Android中关于图像处理基础的,也是重要的类之一,使用其可以实现图像文件信息的读取和写入,进行图像剪切、旋转、缩放等操作,并可按指定格式保存图像文件。Bitmap类的常用方法如表所示。

返回类型

方  法

简  述

static Bitmap

creatBitmap(Bitmap source, int x, int y, int width, int height)

从源位图中创建新的Bitmap对象

creatScaledBitmap(Bitmap src, int dstWidth, int dstheight, boolean filter)

对源位图进行缩放,构成新位图

creatBitmap(int width, int height, Bitmap.Config config)

根据指定的数据、配置创建新位图

creatBitmap(Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter)

从源位图中创建新的Bitmap对象,并进行Matrix变换

final int

getHeight()

获取位图的高

getWeight()

获取位图的宽

 

  1. 在Android中Bitmap比较特别,因为Bitmap类的构造函数是私有的,并不能实例化,而只能借助于BitmapFactory类获取文件资源,从而得到一个实例。BitmapFactory类的常用方法如表所示:

 

 

返回类型

方  法

简  述

static Bitmap

decodeByteArray(byte[] data, int offset, int length)

根据指定的数据文件解码Bitmap

decodeFile(String pathName)

根据指定的路径创建Bitmap

decodeFileDescriptor(FileDescriptor fd)

根据指定的文件说明符解码Bitmap

decodeResource(Resources res, int id)

根据指定的资源创建Bitmap

decodeStream(InputStream is)

根据指定的输入流解码Bitmap

 

 

 

  1. 从以上的方法中不可看出,BitmapFactory相当于从一个指定的文件中获取并解析出Bitmap。一般有两种读取Bitmap的方法
    方法一:以R文件的方式,我们一般把图片放在/res/drawable目录下,所以直接在程序中通过该图片对应的资源号就可以获取图片对象,例如res/drawable下有test.png图片,代码如下:
    Bitmap bitmap = BitmapFactory.decodeResource(this.getContext()
    .getResorces, R.drawable.test)
    方法二:以文件流的方式,假设在sdcard下有 test.png图片
    FileInputStream fis = new FileInputStream("/sdcard/test.png");
    Bitmap bitmap = BitmapFactory.decodeStream(fis);

四、Android中的动画

  1. 在Android 3.0以前,Android支持两种动画模式:
     Frame Animation(逐帧动画):可以将一系列的图像依次显示,以模拟动画效果,就像GIF图一样。
     Tween Animation(补间动画):对图形做基本动画处理,例如渐变、旋转、伸缩以及移动的操作。
    之后又添加了一种新的动画方式:
     Property Animation(属性动画):顾名思义就是利用对象的属性变化形成动画的效果,例如一个按钮的位置和大小。
    这三种动画在SDK中分别被称为:Drawable animation、view animation以及Property animation,本节将详细介绍这三类动画的运用方式。
  2. Frame Animation,即逐帧动画,通过一系列Drawable控制依次显示动画过程中的每张静态图片,利用人眼“视觉暂留”的原理以达到动画效果。在XML文件中可以对这种动画进行配置,并将文件保存在res/drawable文件夹中,配置逐帧动画非常简单,在<animation-list…/>元素中逐个配置元素即可定义动画的各个帧,制定各个帧的持续时间即可,相关的配置属性如表所示:

属  性

说  明

参数说明

oneshot

循环属性

当设置为true时动画只循环一次,否则一直循环

drawable

动画资源

 

    visible

drawable是否初始可见

 

duration

动画持续时间

时间以毫秒为单位

  1. Tween Animation,即补间动画,可以对,让某个控件出现旋转、渐变、移动、缩放的一个转换过程。补间动画实现的原理比较简单,开发者无需定义每一帧的图像,只需要定义动画开始与结束的关键帧(首帧和尾帧)即可,同时制定动画执行的时间即可,其过程就如图所示。
    Tween Animation只能应用于View对象,而且只支持一部分属性,如支持缩放旋转而不支持背景颜色的改变等。
    Tween Animation主要由4种类型组成:
     alpha( android.view.animation.Alpha.Animation ):渐变动画,可实现fadeIn和fadeOut效果。
     rotate( android.view.animation.Rotate.Animation ):旋转动画,可实现移动控件的旋转效果。
     scale( android.view.animation.Scale.Animation ):缩放动画,可实现动态调整控件尺寸的效果。
     translate( android.view.animation.Translate.Animation ):位移动画,可实现控件水平、垂直位移的效果。
    Android中的四种animation类型在Java 中对应相应的类:AlphaAnimation、ScaleAnimation、TranslateAnimation及RotateAnimation。可以调用这些类的相关方法来获取和操作相应的属性。这四类有部分属性是相同的,如表所示。

属  性

方  法

简  述

android:detachWallpaper

setDetachWallpaper(boolean)

当窗口在墙纸顶层时,窗口动画,墙纸不动画

android:duration

setDuration(long)

总计动画运行时间

android:fillAfter

setFillAfter(boolean)

其值为true时,该动画转化在动画结束后被应用

android:fillBefore

setFillBefore(boolean)

其值为truefillEnabledfalse时,该动画转化在动画开始前被应用

android:fillEnabled

setFillEnabled(boolean)

其值为true时,fillBefore的值被考虑

android:interpolator

setInterpolator(Interpolator)

设置动画的interpolator 

android:repeatCount

setRepeatCount(int)

设置动画重复的次数

android:repeatMode

setRepeatMode(int)

设置动画重复的模式

android:startOffset

setStartOffset(long)

设置在动画运行前延迟数毫秒

android:zAdjustment

setZAdjustment(int)

设置动画的Z Order的改变

  1. alpha渐变透明度动画效果的属性如表所示。

属  性

说  明

参数说明

fromAlpha

动画起始时透明度

以上值取为0.0-1.0之间的float数据类型的数字0.0表示完全透明1.0表示完全不透明

toAlpha

    动画结束时透明度

duration

动画持续时间

时间以毫秒为单位

rotate 画面转移旋转动画效果属性如表所示。

属  性

说  明

参数说明

fromDegrees

动画起始时物件的角度

当起始角度小于结束角度时,物件顺时针旋转

toDegrees

动画结束时物件旋转的角度

pivotX 

动画相对于物件的X坐标的开始位置

0%-100%中取值

50%为物件的XY方向坐标上的中点位置

 

pivotX 

动画相对于物件的X坐标的开始位置

duration

动画持续时间

时间以毫秒为单位

scale 渐变尺寸伸缩动画效果属性如表所示。

属  性

说  明

参数说明

fromXScal

动画起始时 X坐标上的伸缩尺寸

0.0表示收缩到没有

1.0表示正常无伸缩

值小于1.0表示收缩

值大于1.0表示放大

fromYScale

动画起始时Y坐标上的伸缩尺寸

toXScale

动画结束时 X坐标上的伸缩尺寸 

toYScale

动画结束时Y坐标上的伸缩尺寸

pivotX 

动画相对于物件的X坐标的开始位置

0%-100%中取值

50%为物件的XY方向坐标上的中点位置

pivotY

动画相对于物件的Y坐标的开始位置

duration

动画持续时间

时间以毫秒为单位

fillAfter

当设置为true ,该动画转化在动画结束后被应用

 

translate 画面转换位置移动动画效果的属性如表所示。

属  性

说  明

参数说明

fromXDelta

动画起始时X坐标上的位置

没有指定的时候,默认是以自己为相对参照物

fromYDelta

动画起始时Y坐标上的位置

toXDelta

动画结束时 X坐标上的位置

toYDelta

动画结束时 Y坐标上的位置

duration

动画持续时间

时间以毫秒为单位

  1. XML文件中必须至少有一个根元素,可以是、、、中的任意一个,也可以是来管理一个由四个根元素中任意几个根元素组成的动画集合。是可以嵌套的。
    有人曾形象地把比喻为一个动画容器,当存在多个动画元素时,默认这些动画同时发生,但也可通过startOffset属性设置各个动画的开始时间,达到多个动画元素顺序播放的效果。
    以上的方法可以决定动画的开始状态、结束状态以及变化效果,通过设置的动画持续时间,就可以算出在中间插入多少帧的动画实现动画效果,但是在动画运行时动画效果的速率还需要借助于Interpolator来控制。Interpolator,可译作“插值器”,用于控制插入帧的属性,它依据特定的算法可以计算出整个动画所需要插入帧的密度与位置,从而使基本的动画实现匀速、加速、减速等各种速度变化的效果。Interpolator接口的常用实现类如表所示。

方  法

简  述

AccelerateDecelerateInterpolator

动画开始、结束时减速,中间加速

AccelerateInterpolator

动画开始时速度较慢,然后开始加速

CycleInterpolator

动画循环播放指定次数,速度按正弦曲线改变

DecelerateInterpolator

动画开始时速度较快,然后开始减速

LinearInterpolator

动画以匀速变化

为了在动画资源中指定补间动画所使用的插值器,定义补间动画的元素支持android:interpolator属性,设置相应的参数就可以控制动画效果的速率。android提供了三种动画插值器如表所示。

属  性

简  述

accelerate_decelerate_interpolator

加速-减速动画插值器

accelerate_interpolator

加速动画插值器

decelerate_interpolator

减速动画插值器

第十一章

一、使用SharedPreferences

1.Android中,很多应用都需要存储一些参数,例如在天气App中,在这次使用App时添加了多个城市,当用户下一次打开时也希望之前设置的城市会保留在手机中以方便直接获取信息,这个时候就需要SharedPreference类的辅助,利用它来存储一些键值对(key-value)参数。SharedPreference类是Android提供的一个轻量级的存储类,特别适用于软件的各项参数的存储。

2.SharedPreference的使用方法

首先是获取其实例对象,只需要通过getSharedPreferences(String, int)就可以直接获取到其实例对象,方法中的第一个参数用于指定该参数的名称,名称不用带后缀,后缀会由Android自动加上,第二个参数指定文件的操作模式,共有四种操作模式。

MODE_APPEND:追加方式存储,判断是否有该参数,如果有在后面添加。

MODE_PRIVATE: 私有方式存储,其他应用无法访问。

MODE_WORLD_READABLE: 表示当前文件可以被其他应用读取。

MODE_WORLD_WRITEABLE: 表示当前文件可以被其他应用写入。

其次是设置参数,在设置时必须通过一个SharedPreferences.Editor对象,以确保在存取时参数保持一致的操作,其操作方法如下所示:

Editor editor = sharedPreferences.edit();

editor存储对象采用"key-value"键值对进行存放,例如editor.putString("name", "hello");这只是对字符串类型的参数进行存放,当然还可以存放更多的类型,方式都为editor.putXxx("key","value")的形式,Xxx可以为BooleanFloatIntLongString

通过commit()方法提交了数据,也可以通过clean()remove()方法清除设置的参数。

在读取数据时,与之对应的获取数据的方法为,getXxx("key","value"),第二个参数为缺省值,如果preference中不存在该key,将返回该缺省值,例如获取上面的参数。

SharedPreferences share=getSharedPreferences("preference1"

,Activity.MODE_WORLD_READABLE);

int i=share.getInt("age",0);

二、File存储

1.使用IO流操作文件

Java中提供的IO流操作在Android中也同样适用,context所提供的openFileOutputopenFileInput就能十分方便的操作文件,具体实现过程如下所示:

(1)文件的存储:

    FileOutputStream out = context.openFileOutput(String filename,int mode);

    //mode模式获得文件输出流。

    out.write(byte[]b);  //写入内容。

(2)文件的读取:  

    FileInputStream in = context.openFileInput(String filename);   

    //获得某个文件的文件流

    int length = in.read(byte[]);   //读取内容。

2.将文件保存到SD

在上述的操作中,直接将文件保存在了默认的存储空间中,如果一个文件很大,则通常存放在手机的SD卡中,如果手机存在sdcard,则sdcard的目录为/mnt/sdcard目录。

Genymotion中,下载安装虚拟机的同时,便会指定存储空间的大小,如图10.8所示:

Android中读取SD卡时,需在AndroidManifest.xml中设置相关权限:

 

 

在Android中1.5、1.6版本的sdcard目录为/sdcard,而Android 2.0以上都是/mnt/sdcard,因此如果我们在保存时直接写具体目录就不行了,我们可以使用Enviroment类去获取外部存储目录,例如这个类提供的getExternalStorageDirectory()方法就能直接获取sdcard目录。还有一种情况就是如果一部手机是否存在sdcard,这时候也需要借助Environment类进行判断,如果没有,则需要提供其他解决方法,比如保存到手机存储,提示不存在sdcard,方法如下:

if(Environment.getExternalStorageState()

.equals(Environment.MEDIA_MOUNTED)){

//执行存储sdcard方法  }

else{  //存储到手机中,或提示无SD卡  }

返回类型

常量或方法名

描述

 

MEDIA_BAD_REMOVAL

存储设备被移除

 

MEDIA_CHECKING

存储设备正在检查

 

MEDIA_MOUNTED

存储设备可读写

 

MEDIA_MOUNTED_READ_ONLY    

存储设备只读

 

MEDIA_REMOVED

存储设备不存在

static File

getDataDirectory()

获取用户data目录

static File

getDownloadCacheDirectory()

获取下载内容目录

static File

getExternalStorageDirectory()

获取扩展存储目录

static String

getExternalStorageState(File path)

获取扩展存储状态

static File

getRootDirectory()

获取更目录

三、SQLite数据库

1. Android上使用SQLite之前,我们需要先了解SQLite的存储机制以及SQL常用操作语句。SQLite 是一个开源的嵌入式关系数据库,实现自包容、零配置、支持事务的SQL数据库引擎。SQLite在易用性、便携性、紧凑性、高效性和可靠性方面的表现十分优秀,SQLite的安装和运行非常简单,在大多数情况下只要确保SQLite的二进制文件存在即可开始创建、连接和使用数据库。如果需要一个嵌入式数据库项目或解决方案,SQLite是绝对值得考虑的。

        SQLite具有一个十分简洁明了的体系结构,如图所示。

  1. 如上图所示,这些模块的分工清晰,将查询过程划分为几个独立的任务,就像在流水线上操作一样。首先让开发人员通过开放的接口与SQLite进行交互;然后再经过Tokenizer(分析器)与Parser(语法分析器)进行编译,转化为底层能更方便处理的层次化数据结构;之后再交给虚拟机完成具体的数据库操作(比如打开一个表的游标、查询一列等);最后在后端中负责数据的排序、读写等操作。
    在了解SQLite的机制之后,还需要学习SQLite中的SQL。SQL是学习数据库的基础,也是关系数据库通信的唯一渠道。使用SQL能够十分便捷地构建、读写、排序、过滤、计算、分组等常用的信息管理。本节主要介绍SQLite中SQL语句的使用,不做深入讲解。
    3.大体上我们可以把 SQL 分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL)。
    查询和更新指令构成了DML 部分:
    select:从数据库表中获取数据
    update:更新数据库表中的数据
    delete:从数据库表中删除数据
    insert into:向数据库表中插入数据
    SQL 的数据定义语言 (DDL) 部分使我们有能力创建或删除表格。我们也可以定义索引(键),规定表之间的链接,以及施加表间的约束。
    SQL 中最重要的 DDL 语句:
    create database:创建新数据库
    alter database:修改数据库
    create table:创建新表
    alter table:变更(改变)数据库表
    drop table:删除表
    create index:创建索引(搜索键)
    drop index:删除索引
    SQL采用声明式的语法规则,就类似与自然语言的表达方式一样,可以清楚地描述需要,而不需要制定如何做。例如我们以处理一个成绩表单为例,表单如下:

id

name

sex

chinese

math

1

Xiaoming

male

89

99

2

Xiaoming

female

78

89

3

Zhangwei

male

85

92

 如果需要查询某一个人的成绩你一定会说:查一下小明的语文成绩,男的那个小明。使用SQL语句的表达方式为:

Select id from grades where name=”xiaoming” and sex=”male”

正如上述语句所示,SQL非常简单,交互方式十分便捷。但要注意,上述语句中有制定含义的单词如“SELECT”“UPDATE”“DELETE”“INSERT”“DROP”等都是关键字,SQL不区分关键字的大小写,例如下面的写法都是相同的语句:

SELECT name from Grades;

seLeCt name From Grades;

        在上述内容中可以知道,创建表的语句属于DDL部分。可以用CREATE TABLE创建表,在创建表时需要指定表名、字段名、字段类型以及其约束。在SQLite中有以下几种数据类型:

vachar(n):长度不固定且其最大长度为 n 的字串,n不能超过 4000

char(n):长度固定为n的字串,n不能超过 254

interger: 值被标识为整数

real: 所有值都是浮动的数值,被存储为8字节的IEEE浮动标记序号

text: 值为文本字符串,使用数据库编码存储

blob: 值是blob数据块,以输入的数据格式进行存储。如何输入就如何存储,不改  变格式

data:包含年份、月份、日期

time:包含小时、分钟、秒

可以看到这几种数据类型对于学过数据库的来说并不陌生。约束用来控制什么样的值可以存储在该字段中。如果需要创建如表10.2所示的表,其SQL语句如下:

create table grades(

id             integer    identity(1,1)  primary key,

name      varchar     not     null,

sex          varchar         not   null,

chinese   interger   not      null,

math       interger    not     null

)

在上述语句中列属性“identity(起始值,递增量)”表示“id”列为自动编号也称为标识列。

SQLite介绍-数据库常用操作

查询:select作为查询数据库的唯一命令,是SQL中功能最为强大的,但也是最复杂的命令。select命令采用一系列的字句将很多关系操作组合在一起。从而可以在数据表中只选择获取所需要的数据。

select命令的通用形式如下:

select [distinct] heading 

from tables     //指定在哪一个表中

where predicate //对字段进行过滤

group by columns     //分组

having predicate

order by colums   //按照什么顺序

limit count,offset; //限定与排序

增加:使用insert命令向表中插入记录。使用insert命令可以一次插入一条记录,insert语句的一般格式为:

insert into table_name (list1,list2…) values (value1,value2…);

变量table_name表示数据插入到那个表中,list1list2…是用逗号分隔的字段名称。这些字段必须是表中存在的,并一一对应于value1,value2…

更新:使用update命令用于更新表中的记录,使用update令可以修改一个表中的一行或者多行中的一个或多个字段,update语句的一般格式为:

update 表名称 set列名称 = 新值 where 列名称 = 某值;

删除:使用delete命令可以删除表中的记录,delete语句的一般格式为:

delete from 表名称where 列名称 = ;

Android平台为了方便开发者操作SQLite,为我们封装了创建和使用SQLite数据库的API。从而可以在应用程序中管理自有的数据库,如表所示:

类名

描述

SQLiteCursor

游标,实现从数据库中返回查询结果。

SQLiteDatabase

提供管理SQLite数据库的操作方法。

SQLiteOpenHelper

辅助类来管理数据库的建立和版本。

SQLiteQuery

读取结果行。

每一个SQLiteDatabase类都代表一个数据库对象,提供了操作数据库的一些方法。在AndroidSDK目录下有sqlite3工具,我们可以利用它创建数据库、创建表和执行一些SQL语句。下面是SQLiteDatabase的常用方法。

返回类型

方法名

描述

static SQLiteDatabase

openDatabase(String path, SQLiteDatabase

.CursorFactory factory, int flags)

打开指定路径下的数据库

static SQLiteDatabase

openOrCreateDatabase(String path, SQLiteDatabase

.CursorFactory factory)

打开或创建指定路径下的数据库

long

insert(String table,String nullColumnHack

,ContentValues  values)

插入一行到数据库

int

delete(String table,String whereClause

,String[]  whereArgs)

删除数据库某一行

int

update(String table,ContentValues values,String whereClause,String[] whereArgs)

更新数据库某一行

Cursor

query(String table,String[] columns,String selection

,String[] selectionArgs,String groupBy,String having

,String orderBy)

数据表查询

Cursor

rawQuery(String sql, String[] selectionArgs)

使用SQL语句进行数据表查询

void

execSQL(String sql)

执行SQL语句

void

setVersion(int version)

设置数据库版本

void

close()

关闭数据库

SQLiteDatabase类本身只是一个数据库的操作类,但是如果需要对数据库进行操作,还需要用到SQLiteOpenHelper(数据库操作辅助类)的帮助,这个类主要生成一  个数据库,并对数据库的版本进行管理。SQLiteOpenHelper是一个抽象类,我们通常需要继承它,并且实现里面的3个函数:

onCreateSQLiteDatabase):在数据库第一次生成的时候会调用这个方法,也就是说,只有在创建数据库的时候才会调用,当然也有一些其它的情况,一般我们在这个方法里边生成数据库表。

onUpgradeSQLiteDatabase, int, int):当数据库需要升级的时候,Android系统会主动的调用这个方法。一般我们在这个方法里边删除数据表,并建立新的数据表,当然是否还需要做其他的操作,完全取决于应用的需求。

onOpenSQLiteDatabase):这是当打开数据库时的回调函数,一般在程序中不是很常使用。

这个类也提供了一些其它常用的数据库操作方法,如表所示:

返回类型

方法名

描述

String

getDatabaseName()

获取数据库名称

SQLiteDatabase

getReadableDatabase()

以只读方式创建或打开数据库

SQLiteDatabase

getWritableDatabase()

以修改方式创建或打开数据库

void

onOpen(SQLiteDatabase db)

当数据库已经打开调用。

int

update(String table,ContentValues values,String whereClause,String[] whereArgs)

更新数据库某一行

void

close()

关闭数据库

在建立好了数据表之后,下一步就是如何查询需要的信息了。SQL提供了select这个功能强大而又复杂的查询语句。同上述的操作方式一样,可以使用SQLiteDatabase类所提供的数据库操作方法,例如:rawQuery()或者Query()方法。在学习这些查询方法之前我们需要了解Cursor这个类。Cursor就是游标,类似于在数据表中游走,用于对结果集进行随机访问,CursorJDBC中的ResultSet作用很相似。Cursor类也提供了一些操作方法:

 

 

 

posted on 2021-11-17 17:36  一眼万年的星空  阅读(169)  评论(0编辑  收藏  举报