Android基础01 快速入门 & 布局

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android基础01 快速入门 & 布局相关的知识,希望对你有一定的参考价值。

android基础01 快速入门 & 布局

01.01  手机制式

第一代模拟制式手机(1G):1G就是大哥大,手机类似于简单的无线电双工电台,通话是锁定在一定频率,所以使用可调频电台就可以窃听通话。

 

第二代GSM、CDMA等数字手机(2G):手机使用PHS,GSM或者CDMA这些十分成熟的标准,具有稳定的通话质量和合适的待机时间,支持彩信业务的GPRS和上网业务的WAP服务,以及各式各样的Java程序等。

技术分享

第三代移动通信技术(3G):3G,是英文3rd Generation的缩写,指第三代移动通信技术。指将无线通信与国际互联网等多媒体通信结合的新一代移动通信系统。它能够处理图像、音乐、视频流等多种媒体形式,提供包括网页浏览、电话会议、电子商务等多种信息服务。

技术分享

第四代移动电话行动通信(4G):该技术包括TD-LTE和FDD-LTE两种制式。4G是集3G与WLAN于一体,并能够传输高质量视频图像,它的图像传输质量与高清晰度电视不相上下。4G系统能够以100Mbps的速度下载,比目前的拨号上网快200倍,并能够满足几乎所有用户对于无线服务的要求。此外,4G可以在DSL和有限电视调制解调器没有覆盖的地方部署,然后再扩展到整个地区。

 

网络制式

2G制式:[GSM:移动/联通、CDMA:电信]

3G制式:[WCDMA:联通、TD-SCDMA:移动、CDMA2000:电信]

4G制式:[FDD-LTE:电信/联通、TD-LTE:移动/电信/联通]

1G制式:彻底退出历史舞台……

 

2G/3G/4G的区别

2G 拨号上网,带宽12.2k每用户

3G 宽带上网,带宽384k~2M每用户

4G 光纤到户,带宽可以达到100M每用户

01.02  Android简史

技术分享

安卓之父:安迪·鲁宾

1. 2003年10月,安迪·鲁宾牵头创建了一家公司,名为Android,开始开发一款针对手机端的操作系统。

2. 2005年8月谷歌低调收购了这家公司及其团队,安迪鲁宾成为Google公司工程部副总裁,继续负责Android项目。

3. 2007年11月,谷歌公司正式向外界展示了这款名为Android的操作系统,并宣布建立一个全球性的联盟组织,该组织由34家手机制造商、软件开发商、电信运营商以及芯片制造商共同组成,他们共同搭建起了Android系统最早的生态圈

4. 2011年,Android在全球的市场份额首次超过塞班系统,跃居第一,目前的主要竞争对手是ios

 

Android进化史

1.5 Cupcake(纸杯蛋糕)

1.6 Donut(甜甜圈)

2.1 Eclair(闪电泡芙)

2.2 Froyo(冻酸奶)

2.3 Gingerbread(姜饼)

3.0 Honeycomb(蜂巢)

4.0 Ice cream SandWich(冰激凌三明治)

4.1 Jelly Bean (果冻豆)

4.2 Jelly Bean (果冻豆)

4.3 Jelly Bean (果冻豆)

4.4 Kitkat  (雀巢的一款巧克力)

5.0 Lollipop  (棒棒糖)

6.0 Marshmallow (棉花糖)

01.03  Android体系结构

技术分享

 

LINUX KERNEL:Linux核心,Android系统是基于Linux系统修改过来的,Android底层都是Linux的东西,大多都是操作硬件的一些驱动,如Display Driver、Audio Drivers等等。

LIBRARIES:用C语言编写的完成Android核心功能的一些类库,如:OpenGL|ES(图形图像引擎简化版)、WebKit(浏览器内核)、SQLite(轻量级数据库)、Surface Manager(界面管理器)、Media Framework(多媒体框架)、FreeType(字体类库)、SGL(另一个图形图像引擎)、SSL(基于TCP的安全协议)、libc(零散的类库)。

APPLICATION FRAMEWORK:应用框架层,全部是用Java语言编写的,供开发人员调用。

APPLICATIONS:应用层,我们安装的所有应用都属于这一层,如,微信,植物大战僵尸。

ANDROID RUNTIME

  • CoreLibraries:核心类库。
  • Dalvik Virtual Machine:Android底层是Linux系统,使用C、C++语言编写的,所以Android程序(Java语言编写)要在Linux上运行就需要虚拟机,也就是DVM。

01.04  DVM和JVM的区别                                  

jvm: .java->.class->.jar 

dvm: .java->.class->.dex->.apk

DVM执行的是.dex格式文件,JVM执行的是.class格式文件。

Android程序编译完之后生成.class文件,然后,dex工具会把.class文件处理成.dex文件,然后把资源文件和.dex文件等打包成.apk文件,apk就是android package的意思。

技术分享 

DVM相比JVM运行效率更高,原因有:

1.每个jar包中都会有很多的class文件,每个class文件都有一个Header,Header中保存了class文件的初始信息,如,生成该class的jdk版本。而在apk文件中的dex文件,只有一个Header,所有class文件的初始信息都保存在其中,效率更高。

2.每个class文件中有常量、字节码、方法、域等保存自己的对应的信息。dex文件中把所有class文件中的常量放在常量池中,所有class文件中的字节码放到一个字节码常量池中,等等。虽然这样打包慢一点,但是读取的时候会很快。

3.class文件存在很多的冗余信息,dex工具会去除冗余信息,并把所有的.class文件整合到.dex文件中,减少了I/O操作,提高了类的查找速度。

 

Android的新虚拟机ART

Android 5.0以上版本的手机正式开始使用ART。

DVM和ART虚拟机的区别:

Dalvik:应用程序每次运行的时候,字节码都需要通过即时编译器转换为机器码,这会拖慢应用的运行效率。

ART:应用在第一次安装的时候,字节码就会预先编译成机器码(java语言翻译成C指令),使其成为真正的本地应用,应用的启动和执行速度都会显著提升。弊端就是ART需要存储java和C两份指令,有些耗内存。

01.05  SDK的获取

SDK (Software Development Kits软件开发工具包)工具包

下载地址:http://www.android-studio.org/

谷歌官方的地址需FQ才能访问,上面的地址是ANDROID STUDIO中文社区的官网。可在上面下载开发工具

工具包包含以下内容:

1. Eclipse + ADT 插件

2. Android SDK

3. Android Platform-tools

4. 最新的Android 开发平台

5. 最新的模拟器镜像

01.06  SDK目录结构

技术分享 

SDK Manager

技术分享

SDK文件夹目录结构

01.07  模拟器的创建

点击技术分享图标,出现下面的窗口,点击New...

 技术分享

弹出以下窗口

技术分享

 

01.08  Android项目目录结构

技术分享

01.09  应用打包安装过程

技术分享

 

1、Android项目编译、打包成apk

apk中包含

  • .dex文件
  • resources.arsc(apk中的“配置文件”、“布局文件”、“图片”的索引)
  • uncompiled resources(未编译的资源,res文件下的资源都是不会被编译的,res文件夹下的图片、布局文件都是原封不动的打包到apk中)
  • 清单文件(AndroidManifest.xml,也会被原封不动的打包进apk中)

被编译的只有.java代码

2、签名(给apk包打个数字签名)

然后再通过ADB运行到Devices emulator上,Devices指的是手机,Emulator指的是模拟器。系统判断两个应用是否属于同一款应用,首先先确认清单文件中Manifest标签的package属性值(应用程序在系统中的唯一标识)是否相同,其次判断签名是否相同。只有两个都相同,才会存在高版本覆盖低版本的情况。也就是说,只有签名相同或者包名相同,是无法覆盖的。签名是属于企业商业机密,是不能被他人获取的。签名是用一个key文件(相当于是秘钥)计算出来的一个字符串,不同的秘钥生成的字符串肯定不同,不同公司的签名也是不同的。所以,一般是无法山寨另一个公司的应用程序的。

01.10  DDMS

DDMS(dalvik debug moniter service)是 Android 开发环境中的Dalvik虚拟机调试监控服务。

它为我们提供例如:为测试设备截屏,针对特定的进程查看正在运行的线程以及堆信息、Logcat、广播状态信息、模拟电话呼叫、接收SMS、虚拟地理坐标等等。

技术分享

 

01.11  ADB进程&指令

ADB(Android debug bridge   Android调试桥)指令

ADB用于建立Android设备与开发环境的连接。模拟器中的操作日志原本是不可能在Windows平台上输出的。但是,正是由于有了ADB,所以LogCat中才可以输出模拟器中的操作日志

 

ADB是一个可执行的指令,在CMD中使用,使用前首先配置环境变量

例:将D:\\develop\\adt-bundle-windows-x86_64_20140101\\sdk\\platform-tools配置到path路径即可

ADB指令

1. adb install xxx(绝对路径).apk:安装指定apk到模拟器中

2. adb uninstall com.yingyonghui.market(包名):从模拟器中删除指定应

3. adb start-server:开启adb进程

4. adb kill-server:结束adb进程

5. adb devices:列出与开发环境建立连接的Android设备的列表

6. adb shell:进入Linux命令行

   ls:列出当前目录结构

   ps:列出当前设备的所有进程

7. netstat -ano:查看端口占用情况

注意: adb同时也是个进程,如果这个进程结束了,Android设备和开发环境连接就会中断,此时控制台会经过11秒尝试连接后,ADB连接重新恢复

01.12  案例电话拨号器

1.创建项目

2.写布局文件,打开res\\layout\\activity_main.xml进行编辑

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"(定义文本的宽,匹配父元素)
    android:layout_height="match_parent"(定义文本的高,匹配父元素)
    android:orientation="vertical"(垂直排列)>

    <EditText(输入框)
        android:id="@+id/et_number"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入号码"(如果文本框中有内容,就不显示提示内容;如果文本框没有内容,就会显示提示内容)/>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:layout_gravity="center_horizontal"
        android:text="拨号"
        android:onClick="call"(给按钮添加click事件)/>
</LinearLayout>

 

3. 写java代码,打开MainActivity.java编辑

package com.example.codedemo;

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity
{
    private EditText mEtNumber;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mEtNumber = (EditText) findViewById(R.id.et_number);//获取输入框对象
    }

    public void call(View view)
    {
        String number = mEtNumber.getText().toString();//获取号码
        if(TextUtils.isEmpty(number))
        {
            Toast.makeText(this, "号码不能为空号", Toast.LENGTH_SHORT).show();
            return;
        }
        else
        {
            Intent in = new Intent();//创建意图对象
            in.setAction(Intent.ACTION_CALL);//设置拨号动作
            in.setData(Uri.parse("tel:"+number));//设置号码,通过Uri转
            startActivity(in);//开启打电话应用的Activity
        }
    }
}

 

4. 添加权限

<uses-permission android:name="android.permission.CALL_PHONE"/>

 

运行界面

技术分享技术分享

 

01.13  短信发送器

布局文件

 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <!-- android:inputType="phone"表示只能输入电话号码 -->
    <EditText
        android:id="@+id/et_phone"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入号码"
        android:inputType="phone" />

    <!-- android:lines="5"表示只能输入5行 -->
    <EditText
        android:id="@+id/et_content"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入内容"
        android:lines="5" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="right"
        android:onClick="send"
        android:text="发送" />
</LinearLayout>

 

 

 

MainActivity.java文件

 

package com.example.codedemo;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.telephony.SmsManager;
import android.view.View;
import android.widget.EditText;
import java.util.ArrayList;

public class MainActivity extends AppCompatActivity
{
    private EditText mEtPhone;
    private EditText mEtContent;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //找到控件
        mEtPhone = (EditText) findViewById(R.id.et_phone);
        mEtContent = (EditText) findViewById(R.id.et_content);
    }

    public void send(View view)
    {
        String phone = mEtPhone.getText().toString();
        String content = mEtContent.getText().toString();

        //获取发送短信的API
        //SmsManager要使用android.telephony包内的,不要使用android.telephony.gsm包内的,已过时。
        SmsManager sm = SmsManager.getDefault();

        //如果短信过长,发布出去,可以把长短信拆分成若干条短短信。
        ArrayList<String> smss = sm.divideMessage(content);

        for(String str : smss)
        {
            /**
             * String destinationAddress 对方号码
             * String scAddress 短信服务中心的号码,可以传null,表示使用默认的短信服务中心地址
             * String text 短信内容
             * PendingIntent sentIntent 表示广播,如果不传null,短信发送成功或失败时,会给予回执信息
             * PendingIntent deliveryIntent 如果对方成功接收信息了,会给予回执信息
             */
            sm.sendTextMessage(phone, null, str, null, null);
        }
    }
}

添加权限

<uses-permission android:name="android.permission.SEND_SMS"/>

 

运行结果:

技术分享

 

 

 

01.14  按钮点击事件

方式1:在布局文件中,给按钮添加一个id,在代码中根据ID找到按钮对象,给按钮添加一个单击事件的监听器,这个方法中接收的参数是监听器的内部类,实现了其中onClick方法

示例代码

<Button
    android:id="@+id/btCall"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="right"
    android:text="点击" />

 

Button mBtCall = (Button) findViewById(R.id.btCall);
if(mBtCall != null)
{
    mBtCall.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            //点击事件需要实现的功能
        }
    });
}

 

方式2:在布局文件中,给按钮添加一个id,在代码中根据ID找到按钮对象,给按钮添加了一个单击事件的监听器,这个方法中接收的参数是自定义的内部类的对象;

<Button
    android:id="@+id/btCall"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="right"
    android:text="发送" />

 

Button mBtCall = (Button) findViewById(R.id.btCall);
MyListener ml = new MyListener();
if(mBtCall != null)
    mBtCall.setOnClickListener(ml);

public class MyListener implements View.OnClickListener
{
    @Override
    public void onClick(View v)
    {
        //点击事件需要实现的功能
    }

 

方式3:在布局文件中,给按钮添加一个id,在代码中根据ID找到按钮对象,让activity实现了OnClickLinstener 接口,实现接口的onClick方法;给按钮添加了一个单击事件的监听器,方法中接收的参数是this;

<Button
    android:id="@+id/btCall"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="right"
    android:text="发送" />

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //找到控件
        Button mBtCall = (Button) findViewById(R.id.btCall);
        if(mBtCall != null)
            mBtCall.setOnClickListener(this);
    }

    @Override
    public void onClick(View v)
    {
        //点击事件需要实现的功能
    }
  }

方式4:在布局文件中,给按钮添加一个onClick的属性="send",在代码中按钮的单击事件的方法必须这么写:

public void send(View view){}

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="right"
    android:onClick="send"
    android:text="发送" />

public void send(View view)
{
    //点击事件需要实现的功能
}

多个按钮Button的onClick属性值可以相同,点击任何一个按钮都会调用相同的方法。通过id可以判断用户按下的是哪一个按钮

01.15  dp 、px 、sp

dp最终显示长度多少是根据屏幕密度来换算的,屏幕越大,1dp就能显示更长的像素。

320x480屏幕上,1dp=1px,160dp=160px,正好是屏幕宽度的一半。

480x800屏幕上,1dp=1.5px,160dp=240px,正好是屏幕宽度的一半。

sp与dp类似,只是sp用于字体大小,dp用于长度大小。

01.16  布局介绍

为适应各种界面风格,满足开发的需要,Android提供了5种布局方式。

1.  LinearLayout(线性布局)

2.  RelativeLayout(相对布局)

3.  FrameLayout(帧布局)

4.  TableLayout(表格布局)

5.  AbsoluteLayout(绝对布局)

01.17  LinearLayout(线性布局)

  • orientation属性是指定线性布局的排列方向:horizontal水平、vertical垂直
  • gravity属性是指定当前控件内容显示位置:left 左边、right 右边、top 上边、bottom 底边
  • layout_gravity属性是指定当前控件在父元素的位置: left 左边、right 右边、top 上边、bottom 底边
  • layout_weightSum(权重)属性是把线性布局中剩余空间分成N份
  • layout_weight (权重)属性是指定当前控件在父元素(线性布局)中占N份
  • visibility属性是控制布局是否显示: visible 显示、invisible 不显示但占空间、gone 隐藏

权重案例:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" 
    android:orientation="horizontal"
    android:weightSum="2"
    >
    <TextView
        android:layout_weight="1"
        android:layout_width="100dp"
        android:layout_height="wrap_content"
        android:background="#ff0000"
        android:text="第一个"
        android:layout_gravity="right"
        android:textSize="20sp" />

    <TextView
        android:layout_weight="1"
        android:layout_width="50dp"
        android:layout_height="wrap_content"
        android:text="第二个" 
        android:textSize="20sp"
        android:background="#00ff00"
        />
</LinearLayout>

 

权重指的是把线性布局中剩余空间分成N份,上例中表示在水平方向上将权重分为2分,2个TextView各占一份

第一个TextView先占屏幕的100dp, 第二个TextView占屏幕的50dp,然后将屏幕的剩余部分分为2份平均分配给两个TextView

运行结果如下:

技术分享

 

当将权重分为3份,2个TextView(android:layout_width="0dp")权重各占一份时,结果如下

技术分享

 

 

所以当排列为水平排列(horizontal),利用权重进行分配的时候,一定要搭配将android:layout_width属性值设置为0dp来使用,这样很容易计算。同理,当排列为垂直排列(vertical),在利用权重进行分配的时候,一定要搭配将android:layout_height属性值设置为0dp来使用。

注意:

1、android:weightSum是可以不写的,上例中,如果第一个TextView的android:weight属性值设置为1,第二个TextView的android:weight属性值设置为2,那么weightSum即为3,两个TextView按照1:2分配。

但是,如果weightSum设置为4,相当于把宽度切成四份,前面3份两个TextView按照1:2分配,第4块不分配。

2、TextView的android:weight属性如果不写,相当于android:weight的属性值为0,也就是不会分配到剩余空间任何部分。

此时,如果android:layout_width属性值设置为0dp,那么就会报错。因为,此TextView已经无法显示出来了。

 

注意:

竖直排列(vertical)时左右对齐有效、水平居中对齐有效、顶部底部对齐无效、竖直居中无效

水平排列(horizontal)时左右对齐无效,水平居中对齐无效、顶部底部对齐有效、竖直居中有效

线性布局中的所有元素永远都不会重叠

01.18  LinearLayout(线性布局)练习

布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    

    <LinearLayout 
        android:layout_weight="1"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:orientation="horizontal"
        >
        <TextView 
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:background="#ff0000"
            />
        <TextView 
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:background="#ffffff"
            />
        <TextView 
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:background="#000000"
            />
        <TextView 
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:background="@android:color/darker_gray"
            />
        
    </LinearLayout>
    <LinearLayout 
        android:layout_weight="1"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:orientation="vertical"
        >
        <TextView 
            android:layout_weight="1"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:backgro

以上是关于Android基础01 快速入门 & 布局的主要内容,如果未能解决你的问题,请参考以下文章

2022最全面&详细的Android学习指南,零基础快速入门的通道

从入门到精通系列Android高级工程师路线介绍,阿里P7亲自教你

React Native基础&入门教程:初步使用Flexbox布局

JavaWeb(黑马程序员:HTML部分)

JavaWeb(黑马程序员:HTML部分)

WPF入门基础教程之布局