Skip to content

基础知识

更新: 6/23/2026 字数: 0 字 时长: 0 分钟

生态与基本架构

Android是由Google基于Linux内核创建的系统,分为四大部分:

  1. Linux Kernel/Linux内核层
  2. Libraries/核心类库层
  3. Application Framework/应用框架层
  4. Application/应用层

Android运行时算在核心类库层中,Android系统中存在一个Dalvik虚拟机实例,Dalvik虚拟机让每一个Android应用都运行在独立的进程中,Dalvik虚拟机(JVM)是Google专门为Android定制的,对于移动端(手机平板)做了大量优化,与其他JVM不同的是,Dalvik虚拟机是基于寄存器进行设计的,其生成的字节码也是特殊的.dex文件

布局

Android SDK中提供了多种布局,常见的是LinearLayout/线性布局,RelativeLayout/相对布局,FrameLayout/帧布局,TableLayout/表格布局,GridLayout/网格布局,ConstraintLayout/约束布局和AbsoluteLayout/绝对布局

image.png

LinearLayout

线性布局分为horizontal/水平和vertical/竖直两种,通过android:orientation属性添加

xml
<LinearLayout  
    android:layout_width="wrap_content"  
    android:layout_height="wrap_content"  
    android:orientation="horizontal">  
</LinearLayout>

<LinearLayout  
    android:layout_width="wrap_content"  
    android:layout_height="wrap_content"  
    android:orientation="vertical">  
</LinearLayout>

RelativeLayout

相对布局是基于父组件和子组件来对位置进行定位

image.png

image.png

xml
<?xml version="1.0" encoding="utf-8"?>  
<RelativeLayout  
    xmlns:android="http://schemas.android.com/apk/res/android"  
    xmlns:app="http://schemas.android.com/apk/res-auto"  
    xmlns:tools="http://schemas.android.com/tools"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent"  
    android:id="@+id/main"  
    tools:context=".MainActivity">  
  
    <TextView        android:id="@+id/c"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:layout_centerInParent="true"  
        android:text="中"  
        android:textSize="60sp"  
        android:textStyle="bold" />  
  
    <TextView        android:id="@+id/n"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:layout_above="@id/c"  
        android:layout_centerInParent="true"  
        android:text="北"  
        android:textSize="60sp"  
        android:textStyle="bold" />  
  
    <TextView        android:id="@+id/s"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:layout_below="@id/c"  
        android:layout_centerInParent="true"  
        android:text="南"  
        android:textSize="60sp"  
        android:textStyle="bold" />  
  
</RelativeLayout>

FrameLayout

帧布局是在页面上开辟一块空间,会默认在左上方放置组件,越后的组件放置在越上方,常用属性:

  • android:foreground:设置帧布局中最前的图像
  • android:foregroundGravity:该图像在帧布局中的位置
xml
<?xml version="1.0" encoding="utf-8"?>  
<FrameLayout  
    xmlns:android="http://schemas.android.com/apk/res/android"  
    xmlns:app="http://schemas.android.com/apk/res-auto"  
    xmlns:tools="http://schemas.android.com/tools"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent"  
    android:id="@+id/main"  
  
    android:foreground="@mipmap/ic_launcher"  
    android:foregroundGravity="left|top"  
    tools:context=".MainActivity">  
  
    <TextView        android:layout_width="200dp"  
        android:layout_height="200dp"  
        android:background="#FF6143" />  
  
    <TextView        android:layout_width="150dp"  
        android:layout_height="150dp"  
        android:background="#7BFE00" />  
  
    <TextView        android:layout_width="100dp"  
        android:layout_height="100dp"  
        android:background="#FFFF00" />  
  
</FrameLayout>

TableLayout

image.png

常用属性:

  • android:collapseColumns:隐藏哪几列
  • android:shrinkColumns:被收缩的列
  • android:stretchColumns:被拉长的列
  • android:layout_column:该控件是第几列
xml
<?xml version="1.0" encoding="utf-8"?>
<TableLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:collapseColumns="0,2"
    android:shrinkColumns="3"
    android:stretchColumns="1"
    tools:context=".MainActivity">

    <TableRow>
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="one" />
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="two" />
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="three" />
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="four" />
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="five" />
    </TableRow>

    <TableRow>
        <Button
            android:layout_column="3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="one" />
    </TableRow>

</TableLayout>

GridLayout

网格布局是对TableLayout的优化,在GridLayout中不用再写TableRow了

image.png

控件

TextView

TextView用于在程序中显示文字

image.png

xml
<TextView  
    android:id="@+id/txtOne"  
    android:layout_width="200dp"  
    android:layout_height="200dp"  
    android:background="#000000"  
    android:gravity="center"  
    android:text="TextView 示例(显示框)"  
    android:textColor="#EA5246"  
    android:textSize="18sp"  
    android:textStyle="bold|italic" />

EditText

image.png

xml
<EditText  
    android:id="@+id/pwdText"  
    android:layout_width="match_parent"  
    android:layout_height="0dp"  
    android:layout_weight="1"  
    android:ems="10"  
    android:gravity="center_vertical"  
    android:hint="请输入登录密码"  
    android:inputType="textPassword"  
    android:selectAllOnFocus="true"  
    android:textColorHint="#FF999999"  
    android:textSize="27sp" />

Activity

Android四大组件是Activity,Service,BroadcastReceiver和ContentProvider

其中Activity负责屏幕中向用户展示的页面,Service负责应用在后台执行的业务,BroadcastReceiver负责向其他应用和系统传递消息,ContentProvider负责在不同的程序之间共享业务

Activity的生命周期分为四个阶段

  • 运行状态:此时Activity处于屏幕最前端并且获取到了焦点
  • 暂停阶段:此时Activity处于可见状态,但是失去焦点,比如被一个系统级弹窗覆盖的情况
  • 停止阶段:此时Activity处于不可见状态,由于不可见进而也没有交点
  • 销毁状态:可以由停止状态和暂停状态撞边而来,系统将Activity删除,一般有两种方式,一种是通知Activity停止自身,另一种是直接将其进程删除

image.png

接着我们来介绍Activity的几个生命周期相关方法

  • onCreate:当Activity被创建时调用
  • onResume:当Activity开始获取到焦点之初执行,因此会可能在onStop,和OnPause函数之后出现
  • OnPause:当Activity失去焦点就出现
  • onStop:当Activity不可见出现,由于不可见前一定失去焦点,所以往往在OnPause之后
  • OnRestart:只有stop后才需要restart,restart会回到create
  • onDestory:Activity销毁时执行

最初的MainActivity就是继承的AppCompatActivity,这里面有上面的这些方法

启动Activity

我们可以使用startActivityForResult开启一个Activity

java
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivityForResult(intent, MY_REQUEST_CODE);

上面的代码中,我们要先创建一个Intent,Intent传入两个参数,一个是唤起新Activity的Activity实例,另一个是要创建的Activity的类文件

使用的startActivityForResult传入两个参数,一个是Intent,一个是requestCode,requestCode的意义是给新启动的Activity命名,后续可以使用它对新启动的Activity销毁

java
finishActivity(MY_REQUEST_CODE);

Intent

这里提到的Intent就是不同组件之间通信的载体,Intent可以启动Activity,Service,BroadcastReceiver

Action和Category是Intent的两个属性,Action用于声明具体要执行的动作,category用于声明该组件适用的环境/附加配置(如:是否是主入口、是否支持默认启动)

Action 常量名对应字符串全称核心作用描述考试高频死磕点
ACTION_MAINandroid.intent.action.MAIN应用程序启动的主入口必须与 CATEGORY_LAUNCHER 绑定出现,用于在桌面生成图标。
ACTION_VIEWandroid.intent.action.VIEW通用展示动作,系统根据数据类型自动用最合适的App打开。经典考题:打开网页



Uri.parse("https://...")
ACTION_DIALandroid.intent.action.DIAL填充号码并跳转到拨号盘,不直接拨出。安全,不需要任何权限。常与 tel:10086 数据配合。
ACTION_CALLandroid.intent.action.CALL直接拨打电话,不经过拨号盘。危险,必须申请 CALL_PHONE 权限,否则报错崩溃!
ACTION_PICKandroid.intent.action.PICK从其他组件或应用中挑选一项数据并带回。常用于打开相册选照片、打开通讯录选联系人。
Category 常量名对应字符串全称核心作用描述考试高频死磕点
CATEGORY_DEFAULTandroid.intent.category.DEFAULT默认的类别属性。隐式跳转的“强行通行证”。XML中不加这一行,隐式 Intent 必崩溃。
CATEGORY_LAUNCHERandroid.intent.category.LAUNCHER让 Activity 显示在系统的桌面应用列表中。选择题常考:决定 App 哪个界面是第一个启动的。
CATEGORY_BROWSABLEandroid.intent.category.BROWSABLE声明该 Activity 可以被浏览器安全调用考点:网页如何直接唤醒并跳转到本地 App 界面。
CATEGORY_HOMEandroid.intent.category.HOME将该 Activity 声明为系统桌面(主屏幕)按下手机 Home 键时,会让用户选择是否用它

Fragment

Fargment是Activity中的一部分,一个Activity可以由多个Fragment组成,由于Fragment是Activity的一部分,所以其生命周期与Activity同步

image.png

Fragment准备阶段:

  • onAttach()(挂载):Fragment 刚被扔进 Activity 肚子里,两者建立了血缘关系,此时可以通过参数拿到宿主 Activity 的对象引用。
  • onCreate()(创建):系统开始创建 Fragment 实例。此时还没有加载任何 UI 界面,只能用来初始化一些纯代码的数据或变量。
  • onCreateView():真正开始加载 Fragment 自己的 XML 布局文件**,在这个方法里,你必须调用 inflater.inflate(R.layout.xxx, ...) 来把布局实例化,并将创建好的 View 对象返回给系统。
  • onActivityCreated()(宿主就绪):告诉 Fragment:“你依附的那个 Activity 已经把它的 onCreate() 执行完了,彻底准备好了。”,只有在这个方法执行后,你才能放心地在 Fragment 里通过 getActivity().findViewById() 去抓取父页面的控件。

Fragment Activity生命周期同步**阶段:

  • onStart()(可见):Fragment 的界面在屏幕上露脸了,但用户还戳不动它。
  • onResume()(交互):Fragment 拿到焦点,变成大前台,用户可以和它疯狂互动。
  • onPause()(暂停):界面可见但失去焦点(比如弹出了一个半透明的系统提示框)。
  • onStop()(停止):界面完全被别人挡住,进入后台。

Fragment死亡阶段:

  • onDestroyView()(清理界面):Fragment 的 UI 界面(View)被销毁并移除了,此时 Fragment 的 Java 对象还没销毁,只是界面没了。如果用了 ViewBinding 或者大内存的 UI 资源,必须在这里置为 null 释放内存。
  • onDestroy()(彻底销毁):整个 Fragment 对象彻底宣告死亡,onDetach()(解绑断绝关系),最后一缕联系被切断,Fragment 和 Activity 彻底说再见。
本站访客数 人次      本站总访问量