程序员人生 网站导航

Android基础笔记(一)

栏目:综合技术时间:2015-04-09 08:31:29

  • 1G - 5G的介绍
  • Android的操作系统的介绍
  • Android版本
  • Android系统的架构
  • 两种虚拟机的不同
  • ART模式
  • 摹拟器的简介
  • SDK目录
  • Android工程目录结构
  • 打包的进程
  • ADB经常使用指令
  • 案例电话拨号器
  • 4种点击事件
  • Android的经常使用布局
  • Andriod中的单位

这里写图片描述

1G - 5G的介绍

1st - Generation
代表作是:大哥大,只能进行语音通讯,不能够发短信、更不能上网。
2nd - Generation
代表作是:小灵通,可以收发短信、可以上网,但是速度几10Kps,而且不能在通话时使用。
3rd - Generation
速率1般在几百Kbps,并可以在通话的时候使用,保持在线,移动互联时期到来。
4th - Generation(LTE - Long Time Evolution - 长时间的进化)
速率到达100Kbps以上,可以在线观看高清视频,上传下载大批量数据。
5th - Generation
速度可到达1Gbps以上,几近满足人们的所有需求。

它们之间最大的区分是:速率的不同

Android的操作系统的介绍

Android是由安迪-鲁宾开发的,1开始只是1个作为智能相机的系统,随着手机市场的扩大转向手机操作系统。

Android名称:安迪-鲁宾非常喜欢1款游戏里面的1个大瓢虫。

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文件,然后将1组class打包成jar)
基于栈结构,栈存储于内存中,所以需要内存空间
Dalvik VM
编写.java文件 -> 编译为 .class文件 -> 打包成.dex文件 -> 打包成.apk文件(将1组class编译为1个dex文件,然后有的平台为了更高的效力会将1个dex转换成odex文件,将N多个class文件编译为1个dex,这样履行效力会比较快,更合适在移动平台运行)
基于寄存器的结构,寄存器在CPU中,所以用到CPU的空间。

请看下图,在JVM和DVM中不同的打包结构:

ART模式

 ART模式通过在安装利用程序时,自动对程序进行代码预读取编译,让程序直接编译成机器语言,免去了Dalvik模式要时时转换代码,实现高效力、省电、占用更低的系统内存、手机运行流畅。
 
 但凡事总有正反两面,ART在解决了该问题的同时,同时也有如:会占用略高1些的存储空间、安装程序时要相比普通Dalvik模式要长1些时间来实现预编译。
 
 ART模式是典型的以空间换时间的解决案例。

9 摹拟器的简介

装备的常见分辨率

名称 分辨率 说明
VGA 480*640 标准的视频接口分辨率
QVGA 240*320 只有VGA的4分之1
HVGA 480*320 只有VGA的2分之1,使用的比较少了,开发使用
WVGA 480*800
FWVGAQ 480:854

Android开发经常使用的适配分辨率:
480 * 800
1280 * 800
VM Heap
虚拟机的内存,每个利用程序所占内存
Snapshot
快照,类似win7的睡眠作用。关闭摹拟器时,会保存当前摹拟器的1些活动状态,数据,下次启动会加载这些信息,启动速度比较快。但是这个快照有bug,不推荐勾选。
CPU
arm、intel,如果下载intel的加速器才能选择
要使用intel加速器,需要安装加速器,并且下载相应镜像文件
Back camera
背部摄像头
Webcam
使用电脑的摄像头
VM Heap
DVM的默许大小,单位是M, 每个利用程序所占内存
Internal Storage
手机内部存储大小
Use host GPU
用电脑的显卡处理器,显卡的cpu,电脑独立显卡,可以勾选,这样摹拟器会快点。集成显卡会花屏
RAM
相当于电脑的内存条,断点数据丢失
ROM
只读存储器,相当于电脑的1块硬盘,断点数据不丢失

SDK目录

add-ons
寄存高级利用的API的文件
build-tools
构建工具
docs
开发文档
extras
寄存依赖的第3方的包
platforms
各个平台的文件
sources
API的源代码文件
system-images
系统的镜像文件
tools
工具文件

Android工程目录结构

src
源代码
gen
系统自动生成的文件
R.java中记录了项目中的各种资源,相当于1个字典
Android 4.2
当前工程所使用的SDK
assets
资产目录
不会在R文件中注册,原封不动的打包到APK中
bin
编译后的2进制文件
包括class、资源文件、dex、apk、清单文件等
libs
工程中所使用的库
res
系统资源,所有文件都会在R文件生成资源ID

① drawable:图片资源

  1. drawable-hdpi:高分辨率的图片目录
  2. drawable-ldpi:低分辨率的图片目录
  3. drawable-mdpi:中分辨率的图片目录
  4. drawable-xhdpi:大分辨率的图片目录
  5. drawable-xxhdpi:超大分辨率的图片目录
② layout:界面布局
③ menu:菜单
④ values:字符串、样式等数据
⑤ anim:动画文件
⑥ raw:原生文件

AndroidManifest.xml
① Android中的4大组件(Acticity、ContentProvider、BroadcaseReceiver、Service)都需要在该文件中注册
② 程序所需的权限也需要在此文件中声明

打包的进程

使用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(); // 创建1个意图:想干甚么事 intent.setAction(Intent.ACTION_CALL); // 6. 设置拨打电话的数据 // Uri 包括了 Url intent.setData(Uri.parse("tel:" + number)); // Uri:统1资源标识符,Url:统1资源定位符 // 7.开启意图 startActivity(intent);

16 4种点击事件

使用内部类实现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(); // 创建1个意图:想干甚么事 intent.setAction(Intent.ACTION_CALL); // 6. 设置拨打电话的数据 // Uri 包括了 Url intent.setData(Uri.parse("tel:" + number)); // Uri:统1资源标识符,Url:统1资源定位符 // 7.开启意图 startActivity(intent); } }

通过匿名内部类来实现

// 实现点击事件的第2种方式:匿名内部类 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); // 设置点击事件的第3种方式 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(); // 创建1个意图:想干甚么事 intent.setAction(Intent.ACTION_CALL); // 6. 设置拨打电话的数据 // Uri 包括了 Url intent.setData(Uri.parse("tel:" + number)); // Uri:统1资源标识符,Url:统1资源定位符 // 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="拨打" />

在代码中增加对应的方法

// 按钮的第4种点击事件,原理:利用的反射技术 // 第4种方式缺点:稀里糊涂 public void click(View v) { callPhone(); }

Android的经常使用布局

线性布局
水平、垂直显示,如果有多个组件,超越屏幕大小,超越部份就不显示
可以通过android:orientation来定义方向
android:orientation=“horizontal”表示水平方向
android:orientation=“vertical”表示垂直方向
相对布局
相对布局是实际布局中最经常使用的布局方式之1。
相对布局在xml文件中使用来定义。
相对布局可以设置某1个视图相对其他视图的位置,这些位置可以包括上下左右等,因此相较于其他的布局方式而言具有很大的灵活性。
RelativeLayout的经常使用属性有以下1些: 第1类:属性值为true或false   android:layout_centerHrizontal 水平居中   android:layout_centerVertical 垂直居中   android:layout_centerInparent 相对父元素完全居中   android:layout_alignParentBottom 贴紧父元素的下边沿   android:layout_alignParentLeft 贴紧父元素的左侧缘   android:layout_alignParentRight 贴紧父元素的右侧缘   android:layout_alignParentTop 贴紧父元素的上边沿    第2类:属性值必须为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 本元素的右侧缘和某元素的的右侧缘对齐 第3类:属性值为具体的像素值   android:layout_marginBottom 离某元素底边沿的距离   android:layout_marginLeft 离某元素左侧缘的距离   android:layout_marginRight 离某元素右侧缘的距离   android:layout_marginTop 离某元素上边沿的距离
表格布局
使用的较少
帧布局
框架布局是将控件组织在Android程序的用户界面中最简单的布局类型之1。
框架布局在xml文件中使用来定义。
框架布局中的子视图总是被绘制到相对屏幕的左上角上,所有添加到这个布局中的视图都是以层叠的方式显示,第1个添加到框架布局中的视图显示在最底层,最后1个被放在最顶层,上1层的视图会覆盖下1层的视图,类似于html中的div。
在框架布局中,经常使用的属性有以下几项:   android:top 将视图放到屏幕的顶端   android:Buttom 将视图放到屏幕的低端   android:Left 将视图放到屏幕的左端   android:Right 将视图放到屏幕的右端   android:Center_vertical 将视图依照垂直方向居中显示   android:Center_horizontal 将视图依照水平方向居中显示

Andriod中的单位

dip
缩写:dp
1个基于density(密度)的抽象单位,这个和装备硬件有关,通常在开发中设置1些view的宽高推荐用这个,1般情况下,在不同分辨率,都不会有缩放的感觉。
在运行时, Android根据使用中的屏幕的实际密度, 透明地处理任何所需dip单位的缩放。
不依赖装备像素,根据装备自动适应大小,推荐使用
sp
同dip/dp类似,会根据用户的字体大小偏好来缩放,专门用于设置字体的大小
px
像素,是屏幕的物理像素点,与密度相干,密度大了,单位面积上的px会比较多。在不同分辨率下会有不同的效果,通常不推荐使用这个。

这里写图片描述

------分隔线----------------------------
------分隔线----------------------------

最新技术推荐