Android一次本意是“机器人”,谷歌2007年基于linux平台开源手机操作系统的名称。由操作系统,中间件,用户界面和应用软件组成。
安卓开发是基于linux内核的(与硬件打交道的)
Hal层(硬件抽象层):目的是把Android框架和内核分隔
Android Runtime(运行层):每个应用都在自己的进程中运行,每个进程都需要有Android Runtime运行环境,运行环境需要DEX文件,所以需要将java代码编译成DEX字节码运行
Java API FrameWork:(应用层) 开发人员需要掌握的一些api
System APP(安卓系统app)照相机 邮件...
安卓开发四大组件
- 1 activity(活动)
所有程序的根本,所有app应用页面的跳转都是activity中,直观能看到的组件。 - 2 service(服务)
没有界面,运行在后台程序的。service是可以和activity进行交互的。比如音乐后台运行,并没有关掉。比如升级下载在后台下载。 - 3 BroadcastReceiver(广播接收器)
app应用层进行信息传输的,比如填写信息微信可以接收到 - 4 Contentprovider(内容提供者)
提供第三方应用数据访问方案
因为Android对数据保护是很严密的,除了sd卡其他数据是不允许直接被进行访问的,所以Contentprovider可以解决这个麻烦
Android平台优势
开放性:所有源代码是开源的
丰富的硬件:因为有很多厂商都在用Android
方便开发:成本很低,直接能安装在手机上
二,安卓开发环境搭建
安卓开发工具
- 1 android studio
是谷歌开发的集成工具,是基于intellig IDEA类似于eclipse
下载地址 - 2 eclipse
早期开发工具,目前已经被淘汰了 - android SDK(software development kit)软件开发工具包
采用的是java语言,所以需要先安装jdk5以上版本
首先我们电脑环境变量先配置好java
第一步选custom 这是自定义设置
配置sdk环境变量
然后在系统path变量中新建,配置SDK的platform-tools和tools目录
三,android UI基础
android UI
- UI
user interface(用户界面)简称UI,是系统和用户之间进行交互的媒介。软件设计可以分为编码设计和UI设计 - android UI
android提供了很多预置的UI组件,例如结构化布局和UI控件
布局
layout布局,定义应用中的页面结构,布局中所有元素均使用view和viewgroup对象的层次进行构建,view绘制用户查看并进行交互的内容,而viewgroup是容器
布局的两种构建方法,一种可以使用xml标签的形式,另一种可以使用代码new对象运行
编写xml布局是写在这里的
加载xml资源
属性
每个view对象和viewgroup对象都有自己xml属性,其中有一些是特有的,还有共有的。
- id属性
任何view对象均有与之关系的整型id,用于结构树中唯一标识的编号,编译应用后会以整形的形式用此id
xml内部标记id语法:android:id="@+id/命名的id值";
@+id和@id区别
@+id是在R.java文件中新增一个id名称,如果存在相同名字id会替换掉
@id是直接饮用在R.java存在的id资源,如果不存在编译报错
id字符串名称同一布局必须唯一。
布局参数
在安卓开发不建议使用px来指定布局的宽度和高度,一般使用相对测量的单位,如db(与密度无关的像素单位),wrap-content(视图设置大小的 文字大尺寸大),match-content(视图采用父视图组件所允许的最大尺寸 ,比如文本外嵌套了一个视图容器,只能撑满父级容器)
布局位置
比如视图在视图容器中会有一个坐标点和宽高
坐标点是通过getLeft()和getTop()方法来获取对于父视图左边距和上边距
宽高是通过getWidth()和getHeight()获取视图的尺寸
px和pd区别
px就是像素点,比如手机是19201080,那么宽高像素点就是19201080,
dp是与像素密度有关,每英寸包含的像素数
比如屏幕物理尺寸是1.5英寸x2英寸,屏幕分辨率为240*320,则我们可以计算出横向的每英寸像素点为240/1.5=60dpi.
内边距和外边距
内边距是视图和容器的距离,外边距是容器和容器间的距离
常用布局
- 1 LinearLayout线性布局
是一个视图容器,用于里面子视图在单个(垂直、水平)方向对齐
android:orientation="horizontal"属性为水平对齐
水平
android:orientation="vertical"为垂直对齐
android:layout_weight分配子视图所占空间比重.
image.png - 2 RelativeLayout 相对布局
子视图通过相应的布局属性,设定另一个兄弟/父容器的相对位置
相对兄弟
相对父元素
对齐方式
- 3 FrameLayout 帧布局(应用很少)
最简单的布局
特点
没有任何布局方式
添加控件的时候默认在左上角
大小控件由最大的控件决定
如果控件一样大只能看见最上面的 - 4 GridLayout 网格布局
类似于手机拨号键盘的布局
填充满用android:layout_gravity="fill"
四,常用组件
TextView
文本框,主要用于显示文本的组件
文本字体尺寸单位sp
文本常用属性
- 文本设置边框
编写一个shapeDrawable的资源文件,然后将TextView的background属性设置为drawable资源即可
android shape的使用
在xml中,用background调用就行了
定义圆角矩形
带图片(drawableXxx)的TextView
EditText输入框
文本类型
数值类型
设置EditText获得焦点,同时弹出小键盘
定位光标所在位置
e.requestFocus();//获取焦点
e.setSelection(2);//定位光标在第二个字符后
那么对于高版本的安卓获取焦点需要手动弹出键盘
对于高版本
Button(按钮)
也是继承TextView
StateListDrawable 是Drawable资源的一种,可以根据不同的状态,设置不同的图片效果,关
键节点 < selector > ,我们只需要将Button的 background 属性设置为该drawable资源即可轻
松实现,按下 按钮时不同的按钮颜色或背景
- btn_bg1.xml
- layout_btn.xml
- MainActivity.java
ImageView(图像视图)
就是用来显示图像的view
ImageView有两个设置图片的属性 1是src ,2是background
src按照图片大小直接填充,不会拉伸
background根据ImageView给定的宽度进行拉伸
- android:scale
- fitEnd , fitStart , fitCenter
- centerCrop 与 centerInside
centerCrop:按横纵比缩放,直接完全覆盖整个ImageView
centerInside:按横纵比缩放,使得ImageView能够完全显示这个图片 - fitXY
不按比例缩放图片,目标是把图片塞满整个View - matrix
从ImageView的左上角开始绘制原图,原图超过ImageView的部分作裁剪处理 - center
保持原图的大小,显示在ImageView的中心。当原图的size大于ImageView的size,超过部分裁剪处理。
RadioButton(单选按钮)和checkBox(复选框)
RadioButton必须是放在RadioGroup按钮组中,另外我们可以为RadioGroup设置orientation属性设置内部单选按钮的排列方式.
开关按钮
- 1 ToggleVutton按钮
- 2 switch
ProgressBar进度条
常见属性
对应java中可以调用
SeekBar拖动条
事件
ScrollView滚动条
如长文章的滚动条
Date Time组件
- 1 TextClock(文本时钟)
- 2 analogClock 模拟时钟
- 3 Chronometer计时器
- 4 Datepicker 日期选择器
五,Adapter 适配器基础
MVC理解
model :数据源
view:显示视图控件 --AdapteView
Controller:控制器 model和view之间的纽带 --adapter
AdapteView常见适配器有:ListView,GridView,Spinner,recycleView
数据是通过控制器绑定到view上面的
ListView控件
GridView网格视图
GridViewActivity.java
Spinner列表选项框
ExpandableListView 可折叠列表
有一点要注意的是,重写isChildSelectable()方法需要返回true,不然不会触发子Item的点击事件
Toast 吐司
安卓用于提示信息的一个组件
AlertDialog对话框
六,Android事件分发机制
- 1 被分发的对象
就是用户触发屏幕而产生的点击事件.
PopupWindow悬浮框
七,四大组件
1.Activity
继承Activity和AppCompatActivity区别
AppCompatActivity兼容了很多低版本的东西
Activity创建流程
- 1自定义 Activity类名,继承Activity或其他子类
Class MyActivity extends Activity{} - 2 重写onCreate方法,在该方法中调用setContentView()设置要显示的视图
- 3 在androidMainfest.xml对Activity进行配置
- 4 启动Activity调用startActivity(Intent)
比如单击按钮跳转到第二个页面
两种启动
1显示启动
Intent in = new Intent (firstActivity.this,secondActivity.class);
startActivity(in);//first跳转到second页面
2 隐式启动
Intent in = new Intent ("传入");<action android:name="android.intent.action.MAIN" />
startActivity(in);
Activity生命周期
Activity组件间通信 Intent
每个应用是由多个activity组成的,每个页面之间需要通信
获取数据
如从第三个页面返回到第一个页面时,进行返回数据操作
第二个页面给第一个页面返回和接收数据
Activity启动模式
standard标准模式 每一次点击都会创建一个activity实例,放在栈内存中,如果你点击3次,退出的话也要点击3次
singleTop模式
如果栈顶activity为我们要新建的activity,那么就不会重新创建activity
singleTask
singleInstance模式
2.Service(服务)组件
线程
- 程序
为了完成特定任务,用某种语言完成一组指令 - 进程
运行中的程序,操作系统会为每个进程分配一个内存空间。程序一次动态执行,经历了代码的加载,执行,执行完毕的过程 - 线程
比进程更小的执行单元,线程需要放到一个进程中才能执行,线程由程序负责管理。进程直接由系统直接调度
创建线程的方式 (3种)
1 继承thread类
- 实现Runnable接口
- 实现Callable接口和Future创建线程
service生命周期
生命周期函数解析:
- 1 onCreate():当Service第一次被创建后立即回调该方法,该方法在整个生命周期 中只会调用一
次! - 2 onDestory():当Service被关闭时会回调该方法,该方法只会回调一次!
- 3 onStartCommand(intent,flag,startId):早期版本是onStart(intent,startId), 当客
户端调用startService(Intent)方法时会回调,可多次调用StartService方法, 但不会再创建新
的Service对象,而是继续复用前面产生的Service对象,但会继续回调 onStartCommand()方法!
IBinder onOnbind(intent):该方法是Service都必须实现的方法,该方法会返回一个 IBinder
对象,app通过该对象与Service组件进行通信!
*4 onUnbind(intent):当该Service上绑定的所有客户端都断开时会回调该方法!
BroadcastReceiver广播接收器组件
为了方便Android系统各个应用及程序内部进行通信,为此Android系统有一套完整的api,允许程序接收和发送广播
- 1 标准广播
- 2 有序广播
注册广播
注册有两种方式,静态和动态,区别是
- 动态注册
- 静态注册
ContentProvider 内容提供者组件 (操作数据库)
我们想在自己的应用中访问别的应用,或者说一些ContentProvider暴露给我们的一些数据, 比如
手机联系人,短信等!我们想对这些数据进行读取或者修改,这就需要用到ContentProvider了!我们自己的应用,想把自己的一些数据暴露出来,给其他的应用进行读取或操作,我们也可以用到ContentProvider,另外我们可以选择要暴露的数据,就避免了我们隐私数据的的泄露!
uri
主要分三个部分:scheme, authority and path。scheme表示上图中的content://,
authority表示B部分,path表示C和D部分。
A部分:表示是一个Android内容URI,说明由ContentProvider控制数据,该部分是固定形式,不可
更改的。
B部分:是URI的授权部分,是唯一标识符,用来定位ContentProvider。格式一般是自定义
ContentProvider类的完全限定名称,注册时需要用到,如:
com.example.transportationprovider
C部分和D部分:是每个ContentProvider内部的路径部分,C和D部分称为路径片段,C部分指向一个对
象集合,一般用表的名字,如:/trains表示一个笔记集合;D部分指向特定的记录,
如:/trains/122表示id为122的单条记录,如果没有指定D部分,则返回全部记录。
八,数据存储
SharedPreferences
当我们的应用想要保存用户的一些偏好参数,比如是否自动登陆,是否记住账号密码,是否在Wifi下才能 联网等相关信息,如果使用数据库的话,显得有点大材小用了!我们把上面这些配置信息称为用户的偏好 设置,就是用户偏好的设置,而这些配置信息通常是保存在特定的文件中!比如windows使用ini文件, 而J2SE中使用properties属性文件与xml文件来保存软件的配置信息;而在Android中我们通常使用 一个轻量级的存储类——SharedPreferences来保存用户偏好的参数!SharedPreferences也是使用xml文件, 然后类似于Map集合,使用键-值的形式来存储数据;我们只需要调用SharedPreferences的getXxx(name), 就可以根据键获得对应的值!使用起来很方便
数据库SQLlite
①SQLite是一个轻量级的关系型数据库,运算速度快,占用资源少,很适合在移动设备上使用, 不
仅支持标准SQL语法,还遵循ACID(数据库事务)原则,无需账号,使用起来非常方便!
②前面我们学习了使用文件与SharedPreference来保存数据,但是在很多情况下, 文件并不一定
是有效的,如多线程并发访问是相关的;app要处理可能变化的复杂数据结构等等! 比如银行的存
钱与取钱!使用前两者就会显得很无力或者繁琐,数据库的出现可以解决这种问题, 而Android又
给我们提供了这样一个轻量级的SQLite,为何不用?
③SQLite支持五种数据类型:NULL,INTEGER,REAL(浮点数),TEXT(字符串文本)和BLOB(二进制
对象) 虽然只有五种,但是对于varchar,char等其他数据类型都是可以保存的;因为SQLite有个
最大的特点: 你可以各种数据类型的数据保存到任何字段中而不用关心字段声明的数据类型是什么,
比如你 可以在Integer类型的字段中存放字符串,当然除了声明为主键INTEGER PRIMARY KEY
的字段只能够存储64位整数! 另外, SQLite 在解析CREATE TABLE 语句时, 会忽略
CREATE TABLE 语句中跟在字段名后面的数据类型信息如下面语句会忽略 name字段的类型信息:
CREATE TABLE person (personid integer primary key autoincrement, name
varchar(20))
小结下特点:
SQlite通过文件来保存数据库,一个文件就是一个数据库,数据库中又包含多个表格,表格里又有
多条记录,每个记录由多个字段构成,每个字段有对应的值,每个值我们可以指定类型,也可以不
指定类型(主键除外)
- 相关的类
-SQLiteOpenHelper:抽象类,我们通过继承该类,然后重写数据库创建以及更新的方法, 我们
还可以通过该类的对象获得数据库实例,或者关闭数据库!
-SQLiteDatabase:数据库访问类:我们可以通过该类的对象来对数据库做一些增删改查的操作
-Cursor:游标,有点类似于JDBC里的resultset,结果集!可以简单理解为指向数据库中某 一
个记录的指针!
9 HTTP
客户端和web服务器通讯的一种格式
常见请求参数有
Get:请求获取Request-URI所标识的资源
POST:在Request-URI所标识的资源后附加新的数据
HEAD 请求获取由Request-URI所标识的资源的响应信息报头
PUT:请求服务器存储一个资源,并用Request-URI作为其标识
DELETE:请求服务器删除Request-URI所标识的资源
TRACE:请求服务器回送收到的请求信息,主要用于测试或诊断
CONNECT:保留将来使用
OPTIONS:请求查询服务器的性能,或者查询与资源相关的选项
GET和POST的对比
GET:在请求的URL地址后以?的形式带上交给服务器的数据,多个数据之间以&进行分隔, 但数据容量通常不能超过2K,比如:http://xxx?username=…&pawd=…这种就是GET
POST: 这个则可以在请求的实体内容中向服务器发送数据,传输没有数量限制
另外要说一点,这两个玩意都是发送数据的,只是发送机制不一样,不要相信网上说的 "GET获得服务器数据,POST向服务器发送数据"!!另外GET安全性非常低,Post安全性较高, 但是执行效率却比Post方法好,一般查询的时候我们用GET,数据增删改的时候用POST!
okhtttp
OkHttp是一个高效的HTTP客户端,它有以下默认特性:
1.支持HTTP/2,允许所有同一个主机地址的请求共享同一个socket连接
2.连接池减少请求延时
3.透明的GZIP压缩减少响应数据的大小
4.缓存响应内容,避免一些完全重复的请求
JSON 和XML对比
JSON和XML的数据可读性基本相同;
JSON和XML同样拥有丰富的解析手段
JSON相对于XML来讲,数据的体积小
JSON与JavaScript的交互更加方便
JSON对数据的描述性比XML较差
JSON的速度要远远快于XML
简单点说Json的优点:体积小,节省流量,只是不如XML直观,可读性 稍微差一点而已!
Android提供的JSON解析类
十,WebView
Android内置了一个webkit内核的高性能浏览器,webview就是把webkit内核封装 ,可以镶嵌在页面上的浏览器控件
Drawable资源
Drawable分为两种:
一种是我们普通的图片资源,在Android Studio中我们一般放到res/mipmap目录下; 另一种是
我们编写的XML形式的Drawable资源,我们一般把他们放到res/drawable目录下,比如最常见
的按钮点击背景切换的Selctor.
在XML我们直接通过@mipmap或者@drawable设置Drawable即可 比如:
android:background = "@mipmap/iv_icon_zhu" /
"@drawable/btn_back_selctor" 而在Java代码中我们可以通过Resource的
getDrawable(R.mipmap.xxx)可以获得drawable资源 如果是为某个控件设置背景,比如
ImageView,我们可以直接调用控件.getDrawale()同样 可以获得drawable对象!
Android中drawable中的资源名称有约束,必须是:[a-z0-9_.](即:只能是字母数字及
和.), 而且不能以数字开头,否则编译会报错: Invalid file name: must contain
only [a-z0-9.]! 小写啊!!!!小写!!!小写!
- ShapeDrawable
- GradientDrawable
- BitmapDrawable
- RotateDrawable
- AnimationDrawable
- LayerDrawable
- StateListDrawable
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/h6javajc/534.html