Android基础笔记(一)

技术分享

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 模拟器的简介

设备的常见分辨率

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

Android开发常用的适配分辨率:
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
只读存储器,相当于电脑的一块硬盘,断点数据不丢失

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:图片资源

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

AndroidManifest.xml
① Android中的四大组件(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(); // 创建一个意图:想干什么事
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会比较多。在不同分辨率下会有不同的效果,通常不推荐使用这个。

技术分享

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。