起源:

  • Android操作系统最初由Andy Rubin(安迪 · 鲁宾)创办的公司研发而来,最初目的是创建一个先进的数码相机操作系统。
    2005年8月由Google注资收购,并于2007年11月5日正式向外界展示了这款名为Android的操作系统,同时组建了一个开放手机联盟组织,该组织由34家手机制造商、软件开发商、电信运营商以及芯片制造商共同组成,他们将共同开发Android系统的开放源代码。随后逐渐扩展到平板电脑及其他领域上。

1.1. 发展史
Android版本 发布日期 代号 API级别
1.0/1.1 2008.9.23/2009.2.2 1/2
1.5 2009.4.30 Cupcake(纸杯蛋糕) 3
1.6 2009.9.15 Dount(炸面圈) 4
2.0/2.1 2009.10.26 Eclair(长松饼) 6
2.2 2010.5.20 Froyo(冻酸奶) 8
2.3 2010.12.6 Ginerbread(姜饼) 9/10
3.0/3.1/3.2 2011.2.22 Honeycomb(蜂巢) 11/12/13
4.0 2011.10.19 Ice Cream Sandwich(冰淇淋三明治) 14/15
4.1 2012.6.28 Jelly Bean(果冻豆) 16
4.2/4.3/ 2012.10.8 Jelly Bean(果冻豆) 17/18
5.0 2014.10.15 Lime Pie(酸橙派) 21
6.0 2015.5.28 Marshmallow(棉花糖) 23
7.0/7.1 2016.3.10 Nougat(牛扎糖) 24/25
8.0/8.1 2017.8/2017.12 Oreo(奥利奥饼干) 26/27
9.0 2018.8 pie() 28
10.0 10 29
11.0 11 30

1.2. Android与iOS

Android是一种基于Linux的自由及开放源代码的操作系统。主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发。

  1. iOS是由苹果公司开发的移动操作系统。iOS与苹果的macOS操作系统一样,属于类Unix的商业操作系统,其最初是设计给iPhone使用的,后来陆续套用到iPodtouchiPad以及AppleTV等产品上。
  2. 从宏观上讲,AndroidiOS最大的不同是前者底层是Linux系统,后者是苹果特有的封装系统。苹果特有的系统能够保证在相同配置下,在显示、动画和运行效率上都优于Android系统。另外一个区别是,Android是开源,可以拥有更多的自由和创造力;iOS闭源,提供标准化规则和建议保证质量。

1.3. Android 体系结构

Android - 图1

  • Linux内核

◦ 是硬件和其他软件堆层之间的一个抽象隔离层

◦ 提供安全机制、内存管理、进程管理、网络协议堆栈、和驱动程序等

Android - 图2

  • 中间件层:由函数库和Android运行时构成
    ◦函数库主要提供一组基于C/C++的函数库
    Surface Manager:支持显示子系统的访问,提供应用程序与2D、3D图像层的平滑连接
    Media Framework:实现音视频的播放和录制功能
    SQLite:轻量级的关系数据库引擎
    OpenGL ES:基于3D图像加速
    FreeType:位图与矢量字体渲染
    WebKit:Web浏览器引擎
    SGL 2D图像引擎
    SSL:数据加密与安全传输的函数库
    Libc:标准C运行库,Linux系统中底层应用程序开发接口
    }中间件层
    ◦Android运行时
    核心库,提供Android系统特有函数功能和Java语言函数功能
    Dalvik虚拟机,实现基于Linux内核线程管理和底层内存管理
    Android - 图3

  • 应用程序框架
    ◦提供Android平台基本的管理功能和组件重用机制
    Activity Manager:管理应用程序的生命周期
    Windows Manager:启动应用程序的窗体
    Content Provider:共享私有数据,实现跨进程的数据访问
    Package Manager:管理安装在Android系统内的应用程序
    Teleghony Manager:管理与拨打和接听电话的相关功能

 应用程序框架

     Resource Manager:允许应用程序使用非代码资源

    Location Manager:管理与地图相关的服务功能

    Notification Manager:允许应用程序在状态栏中显示提示信息

Android - 图4

  • 应用程序
    ◦提供一系列的核心应用程序
    ◦包括电子邮件客户端、浏览器、通讯录和日历等
    Android - 图5

1.4. Dalvik虚拟机

安卓系统最早使用JVM,后来由于版权原因被SUN起诉,所以Google自己开发了DVM。

区别:

    编译过程: JVM: .java -> .class -> .jar

                        DVM: .java -> .class -> .dex -> .odex

    架构区别: JVM基于栈 , DVM基于寄存器

1.5. ART模式
  • ART模式是什么?ART模式是Android Runtime的简称。这是Android 4.4中新增应用运行模式,在ART模式下运行应用将更加流畅。

  • 其实在Android 4.2以前,安卓手机系统的应用程序均在Dalvik Java的虚拟机上运行,这种运行模式还要依靠一个编译器来实现与应用程序的沟通。应程序每次运行时,都需要将程序内的代码即使转变为机器码才能运行,这无形中多附加了一道手续,这就造成了耗电相对较快、占用内存大、即使是旗舰机用久了也会卡顿严重的现象。

  • ART模式最大的作用就是提升了安卓系统流畅度,相比Dalvik模式中出现的耗电快、占用内存大、即使是旗舰机用久了也会卡顿严重等现象,ART模式中这种问题得到了很好的解决,通过在安装应用程序时,自动对程序进行代码预读取编译,让程序直接编译成机器语言,免去了Dalvik模式要时时转换代码,实现高效率、省电、占用更低的系统内存、手机运行流畅。

  • 从安卓5.0开始,官方就逐步废弃Dalvik模式,到现在安卓10.0,基本上都是基于ART模式了。

Android程序开发与应用环境:

2.1. 搭建Android应用程序开发环境
PC & OS Windows & Mac OS & Linux
JDK java8
IDE(集成开发环境) Android Studio & Eclipse
Phone Or Emulater 手机 &模拟器(genymotion&逍遥&夜神)

2.2. 搭建Android应用程序开发环境
  1. 创建新的Android项目
    第一步:选择开发项目的模板
    第二步:配置项目(取名(首字母大写),设置包名,选择编程语言,选择最低支持的版本号)
    第三步:创建项目
    打开android—>创建一个新的android工程—>选取一个模板—>配置项目

  2. 创建Android虚拟设备
    Android程序完成后就需要在设备上进行测试,这个设备可以是真机也可以是各种各样的模拟器。
    1.AVD(Android Virtual Device):安卓自带的模拟器
    2.Genymotion,夜神,逍遥:第三方模拟器

  3. Android SDK(Software Development Kit)安卓开发工具包
    SDK platform(SDK平台):
    Android SDK Platform package:在Android的SDK平台包。这是编译该版本的应用程序所必须的。
    System Image packages:在Android模拟器上运行该版本至少需要其中一个版本。
    Sources for Android package:这包括平台的源文件。在调试应用程序时,Android Studio可能会显示这些文件中的代码行
    SDK tools(SDK工具)
    Android SDK工具是Android SDK的一个组件。它包括Android的完整开发和调试工具集。它包含在Android Studio中。
    Android - 图6

2.3. 分析项目中的结构代码
src 源代码
gen 自动生成的目录,存放R
bin 存放apk文件
res 资产目录
libs 依赖的库文件
drawable 图片资源
layout 布局
values 字符串,颜色,样式
AndroidManifests 清单文件,包含了App的配置信息,安卓的四大组件都需要在清单中声明

Activity:

四大组件:

  • activity 显示界面
  • service 服务
  • Broadcast Receiver 广播
  • Content Provider 数据通信—数据库

概念:

  • Activity是什么?
    Activity是Android应用程序的四大组件之一,它负责管理Andriod应用程序的用户界面。
    一个应用程序由一个或多个Activity组成,每个Activity组件负责一个用户界面的展现。
    Activity分为基本Activity和由它启动的Activity。
    程序启动后显示的第一幅画面是应用程序的第一个Activity(默认窗口),而后可以根据需要从这个Activity启动另一个新的Activity。
    每个Activity代表了可以和用户进行交互的可视化界面,并通过setContentView( )方法将其呈现出来。
    每个Activity是通过继承和扩展基类Activity来实现的。Activity继承于android.app.Activity基类,其他的Activity继承该父类后,通过重载(Override)父类的方法来实现各种需要的功能。

3.1 Activity的创建:

  • 包名处点击右键选择【New】—》【Activity】—》【Empty Activity】选项,填写Activity信息,完成创建。

    • Activity名称,布局名称,包名
  • 包名处点击右键选择【New】—》【Java Class】选项,填写Java类名,完成创建。在该类中继承AppCompatActivity,并在清单文件中进行注册,完成Activity的创建。
    包名处点击右键选择【New】【Java Class】选项,填写Java类名,完成创建。在该类中继承Activity。
    当启动该Activity时,会抛出异常信息。
    在AndroidManifest.xml文件的<application></application>标签中配置Activity:
                <activity android:name="cn.itcast.activitybasic.SecondActivity" />
    如果Activity所在的包与AndroidManifest.xml文件的<manifest></manifest>标签中通过package属性指定的包名一致,则android:name属性的值可以直接设置为“.Activity名称”。
                  <activity android:name=".SecondActivity">
    
  • 开启Activity:startActivity()
    在MainActivity的onCreate()方法中启动SecondActivity
    Android - 图7
    −关闭Activity:finish()

3.2 Activity的生命周期

概述:
  • 在Android中,大部分的组件都有生命周期

  • Activity的生命周期是指一个Activity从创建到销毁的全过程

Activity的生命周期分为五种状态

启动状态:当Activity启动之后便会进入下一状态。过渡状态,短暂

运行状态:Activity处于屏幕最前端,可与用户进行交互

暂停状态:Activity仍然可见,但无法获取焦点,用户对它操作没有响应。

停止状态:Activity完全不可见,系统内存不足时会销毁该Activity

销毁状态:Activity将被清理出内存。过渡状态,短暂

Android - 图8

  1. onCreat()

    当一个Activity被第一次创建时调用此方法。

    这个方法通常用于:

    (1)为Activity设置所要使用的布局文件(setContentView)。

    (2)为按钮绑定监听器等静态的设置操作。

    是否可被系统杀死(回收)? (No)

    下一个方法onStart()

  2. onStart()
    当Activity处于可见状态时调用此方法。在这里可以写一些初始化的配置。
    是否可被系统杀死? (No)
    下一个方法onResume()

  3. onResume ()

开始与用户交互时(能够获取用户焦点可以进行点击等操作的时候),调用此方法。

是否可被系统杀死?  (No)

下一个方法onPause()

  1. onPause ()

    当系统启动另一个新的Activity时先调用前一个Activity的此方法。这个方法通常用于:保存现有的Activity中的 数据、停止动画等,这个实现方法必须非常快。

是否可被系统杀死? (Yes)

下一个方法onResume()或onStop()

  1. onStop ()
    当Activity处于不可见状态时(现有Activity被新的Activity完全覆盖时),调用之前Activity的此方法。
    注:如果只是在现有Activity中弹出一个对话框,没有完全覆盖现有的Activity,不会调用此方法。
    是否可被系统杀死? (Yes)
    下一个方法onRestart()或onDestroy()

  2. onRestart ()
    之前被停止,现在被重启,调用此方法。
    是否可被系统杀死? (No)

    下一个方法onStart()
    
  1. onDestroy ()
    销毁Activity。有两种情况下会对Activity进行销毁:
    (1)在系统内存不足以支撑现有的应用程序的情况下,系统会关闭(销毁)一部分系统认为不必要的Activity,以节省空间。
    (2)程序中手动调用finish()方法进行销毁。
    是否可被系统杀死? (Yse)

第一次运行程序时调用的生命周期方法为:onCreate()— onStart()—onResume()。

退出程序时调用的生命周期方法为:onPause()—onStop()—onDestory()。

  • 横竖屏切换时的生命周期
    手机横竖屏切换时,系统会根据AndroidManifest.xml文件中Activity的configChanges属性值的不同而调用相应的生命周期方法。
    (1)没有设置configChanges属性的值时:
    当由竖屏切换横屏时,调用的方法依次是onPause()、onStop()、onDestory()、onCreate()、onStart()和onResume()的方法。
    (2)设置configChanges属性
    android:configChanges=”orientation|keyboardHidden”>
    打开程序时同样会调用onCreate()— onStart()—onResume()方法,但是当进行横竖屏切换时不会再执行其他的生命周期方法。

  • 如果希望某一个界面一直处于竖屏或者横屏状态,不随手机的晃动而改变,可以在清单文件中通过设置Activity的screenOrientation属性完成。
    竖屏:android:screenOrientation=”portrait”
    横屏:android:screenOrientation=”landscape”

3.3 Activity之间的跳转

Activity之间的跳转需要用到Intent组件:Intent被称为意图,是程序中各组件进行交互的一种重要方式,它不仅可以指定当前组件要执行的动作,还可以在不同组件之间进行数据传递。

Intent一般用于启动Activity、Service以及发送广播等。

根据开启目标组件的方式不同,Intent被分为两种类型:
  • 显示意图
    显式意图可以直接通过名称开启指定的目标组件
    Android - 图9

  • 隐式意图。

Android - 图10

在目标Activity的清单文件中添加如下代码:

Android - 图11

  • 当发送一个隐式Intent后,Android系统会将他与程序中的每一个组件的过滤器进行匹配,匹配属性有 action、data、category,需要这三个属性都匹配成功才能唤起相应的组件

3.4 Activity中的数据传递

Intent不仅可以开启Android组件,还可以在Android之间进行数据传递。

数据传递源Activity端代码示例如下

Intent intent = new Intent(MainActivity.this, Main2Activity.class);
intent.putExtra(“data”, “王大锤”);
startActivity(intent);

第一行代码是创建一个开启Main2Activity的intent。

第二行代码用putExtra()方法传递一个字符串data, putExtra()方法中接收

   两个参数,

    第一个参数是key,用于从Intent中取值,

    第二个参数是传递的数据内容。

第三行代码是利用startActivity方法打开新的Activity

如何在目标Activity中取出传递过来的数据,代码示例如下:

Intent intent=getIntent();<br />
String data = intent.getStringExtra(**"data"**);

首先通过getIntent()方法获取Intent对象,然后调用getStringExtra()方法根据传入的键值取出相应的数据。

由于这里传递的是字符串类型的数据,因此使用getStringExtra()获取传递的数据,如果传递的数据是整型数据, 则使用getIntExtra()方法,以此类推。

数据回传:使用Intent既可以把数据传递给下一个Activity,也可以把数据传递给上一个Activity。

源Activity代码如下:

Intent intent1 = new Intent(Main2Activity.this, Main3Activity.class);
startActivityForResult(intent1,1);

第一行代码是创建一个跳转到Main3Activity的intent

第二行代码startActivityForResult(intent1,1)实现从Main2Activity跳转到

Main3Activity,该方法包含两个参数,第一个参数是Intent对象,第二个参

数是请求码,用于判断数据的来源,输入一个唯一值即可。

Android - 图12

为了得到回传的数据,必须在源Activity中复写onActivityResult(int requestCode, int resultCode, @Nullable Intent data)方法。
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
   super.onActivityResult(requestCode, resultCode,data);
   textView=findViewById(R.id.textView);
   if(requestCode==1){
   if(resultCode==1) { 
      String string = data.getStringExtra(“extra_data”);
               }
                   }
                       }

界面布局与常用资源使用:

4.1 UI概述

  • 在Android中,UI(User Interface,用户界面)界面是人与手机之间数据传递、交
    互信息的重要媒介和对话接口。
    -Android UI(User Interface,用户界面)设计主要指对应用app的界面样式、美观
    程度、人机交互方式等方面的整体设计与综合布署。
    -Android程序开发的一个重要环节就是界面处理,界面的美观度直接影响用户的第
    一映像,因此,开发一个整齐、美观的界面是至关重要的。

  • -在Android程序中界面是通过布局文件设定的,在每个默认程序创建时会默认包
    含一个主界面布局,该布局存储于res/layout目录中。
    -实际开发中每个应用程序都包含多个界面,而程序默认提供的一个主界面布局是
    无法满足需求的,因此在程序中会添加多个布局。
    Android - 图13

    • 组件的ID属性
      如新建了一个Button组件,可在XML中采用如下方式为其分配ID号:android:id=“@+id/my_button”。
  • 尺寸参数

match_parent

  • Android - 图14

  • Android 部分布局属性 | 标记 | 可能的取值或说明 | | —- | —- | | xmlns:android | http://schemas.android.com/apk/res/android | | android:orientation | 取值:vertical,horizontal。使用例: setOrientation(LinearLayout.HORIZONTAL) | | android:layout_width | match_parent,wrap_content,或100dip,50dip等 | | android:layout_height | 同上 | | android:weight android:layout_weight | 0, 1 | | android:layout_gravity | 显示位置,默认为top,可取bottom、left、right、fill_vertical、fill_horizontal、center、fill、center_vertical、center_horizontal等。center_vertical为居中,余类似 | | android:padding | 内边距,20sp, 20dip等 | | android:paddingTop | 20sp, 20dip等 | | android:id | @+id/myname | | android:autoText | 自动拼写帮助 | | android:text | @string/myname,或直接给定字符 | | android:textColor | #rgb, #argb, #rrggbb, #aarrggbb等 | | android:textSize | 20sp, 20dip等 | | android:textAlign | 文字对齐,如取值center。(EditText没有这个属性) | | android:textScaleX | 控制字与字之间的间距,如取值1.5 |

android:textColorHighlight 设置被选中文字的底色,如取值#cccccc,默认为蓝色
android:typeface 字型,取值可以为normal、sans、serif、monospace等
android:editable 指是否可编辑
android:hint 设置显示在控件上的提示信息
android:textColorHint 设置提示信息文字的颜色,如取值#ffff00,默认为灰色
android:numeric 设置输入数字类型,取值为integer表示只能输入整数,decimal表示输入小数
android:capitalize 取值为characters时,为显示大写字母
android:textSize 设置字体大小,如取值20dip等
android:textStyle 字体,取值为bold、italic、bolditalic等
android:textColor 设置字体颜色,如取值为#ff8c00等,或COLOR.BLUE等(需引用相应的包)
android:password 取值true或false。为true时,输入显示为密码
android:singleLine 取值true或false,设置单行输入是否为真,如设置true,则不自动换行
android:src @android:drawable/png, @drawable/png
android:background @drawable/png或#rrggbb
android:password true, false
android:autoLink All
android:max 0-100
android:progress 0-100
android:numStars 1-5
android:rating 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5
android:flipInterval 1000, 2000 (ms)
android:layoutAnimation @anim.anim_layout
android:animation @anim/文件名
android:verticalSpacing 10dp, 10dip等
android:horizontalSpacing 10dp, 10dip等
android:numColumns Auto_fit
android:columnWidth 10sp, 10dip等
android:stretchMode ColumnWidth
android:enabled True
android:clickable True

4.2 布局:

概述:在开发Android应用程序时,用户界面UI是系统和用户之间进行交互的窗口,Activity则是UI容器。

分类:Android中的布局管理一般要在XML中进行规划和设计。布局方式如下几种:
    ◦线性布局(Linear Layout)

    ◦相对布局(Relative Layout)

    ◦帧布局(FrameLayout)

    ◦表格布局(TableLayout)

    ◦网格布局(GridLayout )

    ◦约束布局(ConstraintLayout )

    ◦绝对布局(AbsoluteLayout)

线性布局:(Linear Layout)

主要以水平或垂直方式显示界面中的控件。

当控件水平排列时,显示顺序依次为从左到右。

当控件垂直排列时,显示顺序依次为从上到下。

Android - 图15

Android - 图16

Android - 图17

Android - 图18

Android - 图19

相对布局:(Relative Layout)
是通过相对定位的方式指定子控件位置,即以其它控件或父容器为参照物,摆放控件位置。

在设计相对布局时要遵循控件之间的依赖关系,一般后加入的控件要依赖于先加入控件的位置。

Android - 图20

Android - 图21

Android - 图22

Android - 图23

Android - 图24

Android - 图25

帧布局(FrameLayout)

◦为放入布局管理器中的每个控件分配一个空白区域,即为一帧,

然后再按照控件放入的顺序上下叠加在屏幕的左上角区域。

占用面积最大的控件决定了帖布局的空间大小。

        帧布局中两个常用属性

Android - 图26

Android - 图27

表格布局(TableLayout)

采用行、列的形式来管理控件,它不需要明确声明包含多少行、多少列,而是通过在TableLayout布局中添加TableRow布局来控制表格的行数,通过在TableRow布局中添加控件来控制表格的列数。

实际上TableLayout和TableRow都是LineLayout线性布局的子类。但是TableRow的参数android:orientation属性值固定为horizontal,且

     android:layout_width=**match_parent**<br />
     android:layout_height=**wrap_content**

所以TableRow实际是一个横向的线性布局,且所有子元素宽度和高度一致。

表格布局属性

Android - 图28

表格布局控件属性

Android - 图29

网格布局(GridLayout )

网格布局(GridLayout )是 Android 4.0 后新增的一个布局,与TableLayout有些类似。

①跟LinearLayout(线性布局)一样,他可以设置容器中组件的对齐方式

 排列对齐: (1)设置组件的排列方式:

          android:orientation="" vertical(竖直,默认 )或者horizontal(水平)

        (2)设置组件的对齐方式:

          android:layout_gravity="" center,left,right,buttom

②容器中的组件可以跨多行也可以跨多列

设置布局为几行几列:

①设置有多少行: android:rowCount="4" //设置网格布局有4行

②设置有多少列:android:columnCount="4" //设置网格布局有4列

设置某个组件位于几行几列 (都是从0开始算):

①组件在第几行: android:layout_row = "1" //设置组件位于第二行

②组件在第几列: android:layout_column = "2" //设置该组件位于第三列

设置某个组件横跨几行几列:

①横跨几行: android:layout_rowSpan = "2" //纵向横跨2行

 ②横跨几列:android:layout_columnSpan = "3" //横向横跨2列

表格布局和网格布局的区别

TableLayout
1.继承LinearLayout
2.不需要明确的申明包含多少行多少列
3.通过添加 TableRow / 其他组件 来控制表格的行数和列数
4.单元格设置格式有3种:Shrinkable(可收缩),Stretchable(可拉伸),Collapsed(隐藏的)
GridLayout
1.Android4.0之后新加的布局管理器
2.能够把整个容器划分为rows*columns的网格,每个网格可以放置一个组件
3.可以设置一个组件横跨多少列或者纵跨多少行
4.当单元格大小大于组件大小时,可以通过设置layout_grativity属性值,设置组件在单元格里的位置
5.通过设置layout_columnWeight/layout_rowWeight属性值,可以设置各个组件的大小比例

约束布局(ConstraintLayout )

约束布局, 在2016年推出. 官方大力支持,可以完全代替其他布局, 减少布局的层级, 优化渲染性能。ConstraintLayout非常适合使用可视化的方式来编写界面 。

从Android Studio 2.3开始, ConstraintLayout已替代RelativeLayout, 成为HelloWorld项目的默认布局.

根据布局中的其他元素或视图, 确定View在屏幕中的位置, 受到三类约束,

即其他视图, 父容器(parent), 基准线(Guideline)。

ConstraintLayout非常适合使用可视化的方式来编写界面

1、相对定位

类似相对位置的

layout_constraintLeft_toLeftOf
layout_constraintLeft_toRightOf
layout_constraintRight_toLeftOf
layout_constraintRight_toRighOf
layout_constraintTop_toTopOf
layout_constraintTop_toBottomOf
layout_constraintBottom_toTopOf
layout_constraintBottom_toBottomOf
layout_constraintBaseline_toBaselineOf
layout_constraintStart_toEndOf
layout_constraintStart_toStarOf
layout_constraintEnd_toStartOf
layout_constraintEnd_toEndOf

Android - 图30

2、角度定位

Circular positioning 也叫圆形定位
代码示例:


//引用的控件ID
app:layout_constraintCircle=”@+id/buttonA”
//圆半径
app:layout_constraintCircleRadius=”100dp”
//偏移圆角度 水平右方向为0逆时针方向旋转
app:layout_constraintCircleAngle=”45” />

Android - 图31

Android - 图32

4、填充父窗体约束
MATCH_CONSTRAINT dimensions
在约束布局中宽高如果为 0dp ,默认占所有的可用空间。
那么有以下几个属性可以使用:
layout_constraintWidth_min and layout_constraintHeight_min //设置最小尺寸
layout_constraintWidth_max and layout_constraintHeight_max //设置最大尺寸
layout_constraintWidth_percent and layout_constraintHeight_percent //相对于父类的百分比

绝对布局(AbsoluteLayout)

绝对布局通过设置坐标的方式将位置固定下来,即( android:layout_x , android:layout_y ) ,屏幕左上角为坐标(0,0) 。

实际应用中,这种布局用的比较少,因为Android终端一般机型比较多,各自的屏幕大小、分辨率等可能都不一样,

如果用绝对布局,可能在有的终端上显示不全等。不利于维护及扩展。因此从Android2.3开始弃用。

4.3 布局创建:

两种创建布局的方式:

方式1:在XML文件(一般是main.xml,也可自定义XML文件)中声明布局方式。在Java程序中通过setContentView( )方法呈现视图,此时一般不需编写很多的Java代码,优点是直观、简洁,实现了UI界面和Java逻辑代码的分离。

方式2:在Java程序中通过代码直接实例化布局及其组件。这种方法不用XML布局,但往往可读性差,且数据的直观表现和逻辑处理纠缠在一起,往往显得程序比较复杂,用的非常少。

Android事件处理机制与常用控件:

  • 掌握常见的事件监听器方法,掌握View被点击、获得焦点等时调用的View.OnClickListener里的onClick()方法、View.OnKeyListener里的onKey()方法等相关的事件监听器方法。

5.1常见的控件:

Android常见的控件有:

◦显示字符串的TextView控件

◦自动完成AutoCompleteTextView控件

◦按钮Button控件

◦输入文本框EditText控件

◦复选框CheckBox控件

◦选择按钮RadioButton控件 选中、未选中

◦线性布局、图像按钮ImageButton控件

◦下拉列表Spinner、ListView控件

◦进度条控件等。

控件是界面组成的主要元素,用户直接与控件进行交互

Android - 图33

5.1.1.Toast

Toast 土司提示框

土司是一种消息提示框

Toast是一种非常好的提示方式,可以使用它将一些短小的信息通知给用户,这些信息会在一段时间后自动消失,并且

不会占用任何的屏幕空间.

Toast有一个队列,多个土司是按照先后顺序排队显示的。

(切记,一定要调用show才能显示)

5.1.2 Button

Button控件表示按钮,它继承自TextView控件,

既可以显示文本,又可以显示图片,同时也允许用户通过点击来执行操作,

当Button控件被点击时,被按下与弹起的背景会有一个动态的切换效果,这个效果就是点击效果 。

5.1.2在Activity中设定Button

◦在布局XML文件(如res\layout\main.xml)中提前定义好的Button,可以通过在Activity中调用setContentView()函数的方法来使用。

◦除此之外,还可以直接在Activity中创建Button(不需要XML布局文件)。

}点击事件四种实现方式

 方式1:使用匿名内部类
1.匿名内部类方式
   在Activity中添加匿名内部类
 btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.i("匿名内部类方式", "button  is clicked");
        }
     });
 方式2:使用当前类对象, 当前类实现对应的接口
设置Button控件的点击监听事件
                 btn.setOnClickListener(this); //this代表onClickListener的引用
接着当前Activity实现OnClickListener接口
                  public class MainActivity extends AppCompatActivity implements                    
                                                                                                          View.onClickListener
然后实现OnClickListener接口中的方法
                  public void onClick(View v) {
                        Log.i("接口方式", "button  is clicked");
                  }
 方式3:创建内部类,自定义单击事件监听类
在当前Activity创建一个内部类并实现OnClickListener接口
            private class Mylistener implements    View.onClickListener{
                        public void onClick(View v) {
                                 Log.i("接口方式", "button  is clicked");
                         }
           }
      (2)创建一个监听器
             Mylistener listener=new Mylistener()
    (3)设置Button控件的点击监听事件
           btn.setOnClickListener(listener);
 方式4:布局文件指定onClick属性,在Activity中编写相应的 onClick方法
  ```java

在布局文件中指定Button控件的onClick属性方式
在layout文件中指定onClick属性
android:onClick=”click“
在Activity中实现这个click方法
public void click(View v){
Log.i(“指定onClick属性方式”, “button is clicked”);
}
注意:Activity中实现的方法名称要与onClick属性设置的名称一致。
```

5.1.3 TextView

TextView控件用于显示文本信息,可通过设置属性定义文本的大小、样式、颜色等信息。

Android - 图34

Android - 图35

Android - 图36

5.1.4 EditView

Android - 图37

Android - 图38

5.1.4 ImageView

Android - 图39

Android - 图40

5.1.5 RadioButton与RadioGroup

RadioButton为单选按钮,需要与RadioGroup 配合使用。

RadioGroup是单选组合框,可容纳多个RadioButton,并把它们组合在一起,实现单选状态。

Android - 图41

5.1.6 CheckBox
    CheckBox表示复选框,它是Button的子类,用于实现多选功能,通过android:checked属性指定CheckBox控件是否选中的状态。

Android - 图42

5.1.7 RatingBar—星级评分条

Android - 图43

Android - 图44

Android - 图45

Android - 图46

5.1.8 SeekBar拖动条

Android - 图47

(2)设置默认进度

  min:设置最小进度

  max:设置最大进度

  progress:设置当前默认进度

(3)thumb属性的使用

  SeekBar有一个非常重要的属性thumb,这个属性用于设置圆形按钮的背景

(4)progressDrawable属性的使用

   progressDrawable可以修改进度条的背景色

5.1.9 ProgressBar进度条

进度条在项目中已经被广泛使用,Android原生的进度条控件是ProgressBar,为了美观,一般还会自定义一个进度条。

(1) visibility属性

gone:默认不显示不占用位置,运行时显示

visible:显示

invisible:不显示但占位置

Android - 图48

5.1.10 ScrollView

ScrollView称为滚动视图,当在一个屏幕的像素显示不下绘制的UI控件时,可以采用滑动的方式,使控件显示。

ScrollView的子元素只能有一个,可以是一个View(如ImageView、TextView等) 也可以是一个ViewGroup(如LinearLayout、RelativeLayout等),其子元素内部则不再限制,否则会报以下异常。

常用属性 android:scrollbars=”none”
设置滚动条显示,none(隐藏),horizontal(水平),vertical(垂直)。

5.1.11 DatePicker和TimePicker

Android - 图49

数据存储

作用:

  • 掌握Android的五种文件存储方式
  • 掌握SQLite数据库的用法

6.1 数据存储方式

Android平台提供了五种数据存储方式

文件存储

是一种较常用的方式,与Java中的文件存储相似,都是通过I/O流的形式存储数据。

SharedPreferences

是Android提供的用来存储一些简单的配置信息的一种机制。

SQLite数据库

是Android自带的一个轻量级数据库,支持基本SQL语法。

ContentProvider

是Android四大组件之一,可以将自己的数据共享给其他应用程序。

网络存储

是通过网络提供的存储空间来存储或获取数据信息。

6.2 文件存储

Android - 图50

Android - 图51

内部存储:内部存储包含读和写两种方式

File存储核心语句:

 (1) openFileOutput(String name,int mode) 保存文件内容,打开指定的私有文件输出

      流

  (2) 返回值类型为 FileOutputStream

  (3) 参数name为要打开的文件名,不能包含路径分隔符

  (4) 参数mode为文件操作模式

      mode的取值:

         MODE_PRIVATE:私有覆盖模式,为默认操作模式,代表该文件是私有数据,只能被当前程序读

                              写,该模式下写入的内容会覆盖原文件的内容

              MODE_APPEND:内容追加模式,检查文件是否存在,存在就往文件追加内容,否则就创建新文件

File读取核心语句:

  (1)openFileInput(String name) 读取文件,打开指定的私有文件输出流

  (2)返回值类型为 FileInputStream

   (3) 参数name为要打开的文件名,不能包含路径分隔符

外部存储

1、由于外部存储可能被移除、丢失或者处于其他状态,因此在使用外部设备之前必须使用Environment.getExternalStorageState()方法来确认外部设备是否可用。

2、当外部设备可用并且具有读写权限时,那么就可以通过FileInputStream(),FileOutputStream()对象来读写外部设备中的文件

Android - 图52

Android - 图53

Android - 图54

Android - 图55

6.3 SharedPreferences存储

SharedPreferences:是Android平台上一个轻量级的存储类,用于程序中一些少量数据持久化存储,比如存储应用程序的配置参数等。

SharedPreferences中存储的数据是以key/value(键值对)的形式保存在XML文件中,该文件位于“data/data/”文件夹中。

要保存的value值只能是float、int、long、boolean、String、StringSet等类型数据。

使用SharedPreferences保存数据的方法:

1、使用Activity类的getSharedPreferences(String name,int mode)的方法获得SharedPreferences对象,其中参数name指定存储键值对(key-value)的文件名称,mode则指定文件操作模式。

2、使用SharedPreferences的edit()方法获得SharedPreferences.Editor对象。

3、通过SharedPreferences.Editor的putXXX(String key,XXX value)方法写入键值对(key-value)。注意:putXXX当中的XXX要与要获取的数据类型一致。

4、通过SharedPreferences.Editor的commit()方法提交要保存的键值对(key-value)。

使用SharedPreferences获取数据的方法:

1、使用Activity类的getSharedPreferences(String name,int mode)的方法获得所需读取的SharedPreferences对象,与上述保存键值对的第一步相同

2、使用SharedPreferences对象的getXXX(String key,XXX defValue)方法可以方便的得到对应键key的值value。

注意:

1、getXXX当中的XXX要与要获取的数据类型一致。

2、getXXX()方法中的第二个参数为缺省值,如果SharedPreferences中不存在该key,将返回缺省值。

6.4 SQLite数据库

Android - 图56

Android - 图57

Android - 图58

创建数据库步骤:

1.创建一个类集成SqliteOpenHelper,需要添加一个构造方法,实现两个方法oncreate ,onupgrade

构造方法super(context, name, factory, version)中的参数介绍:

context :上下文 ,

name:数据库文件的名称

factory:用来创建cursor对象,默认为null

version:数据库的版本号,从1开始,如果发生改变,onUpgrade方法将会调用,

     4.0之后只能升不能降

2.创建这个帮助类的一个对象,调用getReadableDatabase()方法,会帮助我们创建打开一个数据库

3.复写oncreate和onupgrdate方法:

oncreate方法是数据库第一次创建的时候会被调用; 特别适合做表结构的初始化,需要执行sql语句;SQLiteDatabase db可以用来执行sql语句

onUpgrade数据库版本号发生改变时才会执行; 特别适合做表结构的修改

SQLite数据库的增删改查

方法一 使用SQL语句进行增删改查

1.创建一个帮助类的对象,调用getReadableDatabase方法,返回一个SqliteDatebase对象

}

2.使用SqliteDatebase对象调用execSql()做增删改,调用rawQuery方法做查询。

方法二 使用SqliteDatebase中自带的方法进行增删改查

1.创建一个帮助类的对象,调用getReadableDatabase方法,返回一个

 SqliteDatebase对象

2.使用SqliteDatebase对象调用insert,update,delete ,query方法做增删改查。

优点:增删改有了返回值,可以判断sql语句是否执行成功

缺点:查询不够灵活,不能做多表查询。所以一般增删改用第二种方式,查询用第一种方式。