1G - 5G的介绍
-
1st - Generation
- 代表作是:大哥大,只能进行语音通信,不能够发短信、更不能上网。 2nd - Generation
- 代表作是:小灵通,可以收发短信、可以上网,但是速度几十Kps,而且不能在通话时使用。 3rd - Generation
- 速率一般在几百Kbps,并可以在通话的时候使用,保持在线,移动互联时代到来。 4th - Generation(LTE - Long Time Evolution - 长时间的进化)
- 速率达到100Kbps以上,可以在线观看高清视频,上传下载大批量数据。 5th - Generation
- 速度可达到1Gbps以上,几乎满足人们的所有需求。
它们之间最大的区别是:速率的不同
Android的操作系统的介绍
Android是由安迪-鲁宾开发的,一开始只是一个作为智能相机的系统,随着手机市场的扩大转向手机操作系统。
Android名称:安迪-鲁宾非常喜欢一款游戏里面的一个大瓢虫。
Android的Logo来源 :要求无性别、种族歧视,设计师在上厕所时看到厕所门上的标识,产生的灵感。
Android版本
几个比较稳定和重要的版本
版本 | API | 特性 |
---|---|---|
2.3.3 | 10 | 增加NFC支付功能,近场感应功能 |
3.0 | 11 | 专为平板电脑和大屏幕设备优化 |
4.1.2 | 16 |
Android系统的架构
-
4层架构:
- ① Applications 原生的应用程序:浏览器、桌面、联系人等
- ② Application Framework 中间介,java代码调用底层c代码,提供各种管理器
- ③ Libraries(c代码库),Android Runtime(Dalvik VM、Libraries C)
- ④ 底层Linux(安全管理、内存管理、进程管理、电源管理、硬件驱动)
注意:Dalvik VM:虚拟机,android代码运行在此虚拟机
两种虚拟机的不同
-
为什么会有两种虚拟机?
- Sun公司的版权问题 传统的JVM
-
编写
.java
文件 ->编译为.class
文件 -> 打包成.jar
文件(将java源码编译为class文件,然后将一组class打包成jar) - 基于 栈结构,栈存储于内存中,所以需要内存空间 Dalvik VM
-
编写
.java
文件 -> 编译为.class
文件 -> 打包成.dex
文件 -> 打包成.apk
文件(将一组class编译为一个dex文件,然后有的平台为了更高的效率会将一个dex转换成odex文件,将N多个class文件编译为一个dex,这样执行效率会比较快,更适合在移动平台运行) - 基于 寄存器的结构,寄存器在CPU中,所以用到CPU的空间。
请看下图,在JVM和DVM中不同的打包结构:
ART模式
ART模式通过在安装应用程序时,自动对程序进行代码预读取编译,让程序直接编译成机器语言,免去了Dalvik模式要时时转换代码,实现高效率、省电、占用更低的系统内存、手机运行流畅。
但凡事总有正反两面,ART在解决了该问题的同时,同时也有如:会占用略高一些的存储空间、安装程序时要相比普通Dalvik模式要长一些时间来实现预编译。
ART模式是典型的以空间换时间的解决案例。
9 模拟器的简介
设备的常见分辨率
- 480 * 800
- 1280 * 800 VM Heap
- 虚拟机的内存,每一个应用程序所占内存 Snapshot
- 快照,类似win7的睡眠作用。关闭模拟器时,会保存当前模拟器的一些活动状态,数据,下次启动会加载这些信息,启动速度比较快。但是这个快照有bug,不推荐勾选。 CPU
- arm、intel,如果下载intel的加速器才能选择
- 要使用intel加速器,需要安装加速器,并且下载相应镜像文件 Back camera
- 背部摄像头 Webcam
- 使用电脑的摄像头 VM Heap
- DVM的默认大小,单位是M, 每一个应用程序所占内存 Internal Storage
- 手机内部存储大小 Use host GPU
- 用电脑的显卡处理器,显卡的cpu,电脑独立显卡,可以勾选,这样模拟器会快点。集成显卡会花屏 RAM
- 相当于电脑的内存条,断点数据丢失 ROM
- 只读存储器,相当于电脑的一块硬盘,断点数据不丢失
名称 | 分辨率 | 说明 |
---|---|---|
VGA | 480*640 | 标准的视频接口分辨率 |
QVGA | 240*320 | 只有VGA的四分之一 |
HVGA | 480*320 | 只有VGA的二分之一,使用的比较少了,开发使用 |
WVGA | 480*800 | |
FWVGAQ | 480:854 |
Android开发常用的适配分辨率:
SDK目录
-
add-ons
- 存放高级应用的API的文件 build-tools
- 构建工具 docs
- 开发文档 extras
- 存放依赖的第三方的包 platforms
- 各个平台的文件 sources
- API的源代码文件 system-images
- 系统的镜像文件 tools
- 工具文件
Android工程目录结构
-
src
- 源代码 gen
- 系统自动生成的文件
- R.java中记录了项目中的各种资源,相当于一个字典 Android 4.2
- 当前工程所使用的SDK assets
- 资产目录
- 不会在R文件中注册,原封不动的打包到APK中 bin
- 编译后的二进制文件
- 包括class、资源文件、dex、apk、清单文件等 libs
- 工程中所使用的库 res
- 系统资源,所有文件都会在R文件生成资源ID
-
① drawable:图片资源
- drawable-hdpi:高分辨率的图片目录
- drawable-ldpi:低分辨率的图片目录
- drawable-mdpi:中分辨率的图片目录
- drawable-xhdpi:大分辨率的图片目录
- drawable-xxhdpi:超大分辨率的图片目录
- ② layout:界面布局
- ③ menu:菜单
- ④ values:字符串、样式等数据
- ⑤ anim:动画文件
- ⑥ raw:原生文件
- ① Android中的四大组件(Acticity、ContentProvider、BroadcaseReceiver、Service)都需要在该文件中注册
- ② 程序所需的权限也需要在此文件中声明
AndroidManifest.xml
打包的过程
使用aapt(application android package tools)工具打包
编译 -> 打包 -> 签名 -> adb -> 部署到手机上
ADB常用指令
-
显示已连接的设备
- adb devices
- 显示内容:设备名,状态(device、offline) 导入文件到手机
- adb push <手机目标路径>
- 推:把电脑上的文件推送到模拟器里 从手机导出文件
- adb pull <手机源文件路径>
- 拉:把模拟器中的文件拉到电脑 安装程序
- adb install
(案例)电话拨号器
// 3. 找到edit控件
EditText et_number = (EditText) findViewById(R.id.et_number);
// 4. 获取到电话号码
String number = et_number.getText().toString().trim();
if (TextUtils.isEmpty(number)) {
// 土司
Toast.makeText(MainActivity.this, "不能为空", Toast.LENGTH_LONG)
.show();
return;
}
// 5. 拨打电话 底层原理:socket通信
Intent intent = new Intent(); // 创建一个意图:想干什么事
intent.setAction(Intent.ACTION_CALL);
// 6. 设置拨打电话的数据
// Uri 包括了 Url
intent.setData(Uri.parse("tel:" + number)); // Uri:统一资源标识符,Url:统一资源定位符
// 7.开启意图
startActivity(intent);
16 四种点击事件
使用内部类实现OnClickListener接口来实现
private class MyButton implements OnClickListener {
@Override
public void onClick(View v) {
// 3. 找到edit控件
EditText et_number = (EditText) findViewById(R.id.et_number);
// 4. 获取到电话号码
String number = et_number.getText().toString().trim();
if (TextUtils.isEmpty(number)) {
// 土司
Toast.makeText(MainActivity.this, "不能为空", Toast.LENGTH_LONG)
.show();
return;
}
// 5. 拨打电话 底层原理:socket通信
Intent intent = new Intent(); // 创建一个意图:想干什么事
intent.setAction(Intent.ACTION_CALL);
// 6. 设置拨打电话的数据
// Uri 包括了 Url
intent.setData(Uri.parse("tel:" + number)); // Uri:统一资源标识符,Url:统一资源定位符
// 7.开启意图
startActivity(intent);
}
}
通过匿名内部类来实现
// 实现点击事件的第二种方式:匿名内部类
btn_call.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
callPhone();
}
});
由类文件去实现监听接口
public class MainActivity extends Activity implements OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 1. 找到按钮
Button btn1 = (Button) findViewById(R.id.button1);
Button btn2 = (Button) findViewById(R.id.button2);
Button btn3 = (Button) findViewById(R.id.button3);
Button btn4 = (Button) findViewById(R.id.button4);
Button btn5 = (Button) findViewById(R.id.button5);
// 设置点击事件的第三种方式
btn1.setOnClickListener(this);
btn2.setOnClickListener(this);
btn3.setOnClickListener(this);
btn4.setOnClickListener(this);
btn5.setOnClickListener(this);
}
private void callPhone() {
// 3. 找到edit控件
EditText et_number = (EditText) findViewById(R.id.et_number);
// 4. 获取到电话号码
String number = et_number.getText().toString().trim();
// 5. 拨打电话 底层原理:socket通信
Intent intent = new Intent(); // 创建一个意图:想干什么事
intent.setAction(Intent.ACTION_CALL);
// 6. 设置拨打电话的数据
// Uri 包括了 Url
intent.setData(Uri.parse("tel:" + number)); // Uri:统一资源标识符,Url:统一资源定位符
// 7.开启意图
startActivity(intent);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button1:
callPhone();
break;
case R.id.button2:
break;
case R.id.button3:
break;
case R.id.button4:
break;
case R.id.button5:
break;
default:
break;
}
}
}
在布局文件增加onclick属性,并在代码中添加对应的方法,并且传入View参数
在布局文件中注册点击事件
<Button
android:onClick="click"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/et_number"
android:layout_below="@+id/et_number"
android:layout_marginTop="32dp"
android:text="拨打" />
在代码中增加对应的方法
// 按钮的第四种点击事件,原理:利用的反射技术
// 第四种方式缺点:莫名其妙
public void click(View v) {
callPhone();
}
Android的常用布局
-
线性布局
- 水平、垂直显示,如果有多个组件,超出屏幕大小,超出部分就不显示
- 可以通过android:orientation来定义方向
- android:orientation=“horizontal”表示水平方向
- android:orientation=“vertical”表示垂直方向 相对布局
- 相对布局是实际布局中最常用的布局方式之一。
- 相对布局在xml文件中使用来定义。
- 相对布局可以设置某一个视图相对于其他视图的位置,这些位置可以包括上下左右等,因而相较于其他的布局方式而言具有很大的灵活性。
RelativeLayout的常用属性有以下一些:
第一类:属性值为true或false
android:layout_centerHrizontal 水平居中
android:layout_centerVertical 垂直居中
android:layout_centerInparent 相对于父元素完全居中
android:layout_alignParentBottom 贴紧父元素的下边缘
android:layout_alignParentLeft 贴紧父元素的左边缘
android:layout_alignParentRight 贴紧父元素的右边缘
android:layout_alignParentTop 贴紧父元素的上边缘
第二类:属性值必须为id的引用名“@id/id-name”
android:layout_below 在某元素的下方
android:layout_above 在某元素的的上方
android:layout_toLeftOf 在某元素的左边
android:layout_toRightOf 在某元素的右边
android:layout_alignTop 本元素的上边缘和某元素的的上边缘对齐
android:layout_alignLeft 本元素的左边缘和某元素的的左边缘对齐
android:layout_alignBottom 本元素的下边缘和某元素的的下边缘对齐
android:layout_alignRight 本元素的右边缘和某元素的的右边缘对齐
第三类:属性值为具体的像素值
android:layout_marginBottom 与父元素底部的距离或者外边距
android:layout_marginLeft 与父元素左边的距离或者外边距
android:layout_marginRight 与父元素右边的距离或者外边距
android:layout_marginTop 与父元素上部的距离或者外边距
-
表格布局
- 使用的较少 帧布局
- 框架布局是将控件组织在Android程序的用户界面中最简单的布局类型之一。
- 框架布局在xml文件中使用来定义。
- 框架布局中的子视图总是被绘制到相对于屏幕的左上角上,所有添加到这个布局中的视图都是以层叠的方式显示,第一个添加到框架布局中的视图显示在最底层,最后一个被放在最顶层,上一层的视图会覆盖下一层的视图,类似于html中的div。
在框架布局中,常用的属性有以下几项:
android:top 将视图放到屏幕的顶端
android:Buttom 将视图放到屏幕的低端
android:Left 将视图放到屏幕的左端
android:Right 将视图放到屏幕的右端
android:Center_vertical 将视图按照垂直方向居中显示
android:Center_horizontal 将视图按照水平方向居中显示
Andriod中的单位
-
dip
- 缩写:dp
- 一个基于density(密度)的抽象单位,这个和设备硬件有关,通常在开发中设置一些view的宽高推荐用这个,一般情况下,在不同分辨率,都不会有缩放的感觉。
- 在运行时, Android根据使用中的屏幕的实际密度, 透明地处理任何所需dip单位的缩放。
- 不依赖设备像素,依据设备自动适应大小,推荐使用 sp
- 同dip/dp相似,会根据用户的字体大小偏好来缩放,专门用于设置字体的大小 px
- 像素,是屏幕的物理像素点,与密度相关,密度大了,单位面积上的px会比较多。在不同分辨率下会有不同的效果,通常不推荐使用这个。