Android Studio 学习——整体框架和概念
一、创建新项目
选择File-->New-->New Project
这里可以随便选,我一般选择Empty Activity,不同的选择,只是界面不同而已。然后静静的等待安装就可以了
二、框架结构
1)manifests
- manifests文件是一个XML文件,它描述了应用程序的基本信息。这些信息包括应用程序的名称、图标、版本号、权限、组件等。
- manifests文件是Android应用程序的核心文件之一,它定义了应用程序的基本结构和行为,同时也是Android系统在安装和运行应用程序时的重要依据。
- manifests文件位于项目的根目录下的app/src/main目录中,开发者可以通过编辑manifests文件来配置应用程序的基本信息和行为。
2)Java
java文件夹中也有许多activity(名字不一定相同)文件
a、Activity生命周期
当用户浏览、退出和返回到您的应用时,您应用中的 Activity 实例会在其生命周期的不同状态间转换。Activity 类会提供许多回调,这些回调会让 Activity 知晓某个状态已经更改:系统正在创建、停止或恢复某个 Activity,或者正在销毁该 Activity 所在的进程。
在生命周期回调方法中,您可以声明用户离开和再次进入 Activity 时 Activity 的行为方式。例如,如果您正构建流媒体视频播放器,当用户切换至另一应用时,您可能要暂停视频或终止网络连接。当用户返回时,您可以重新连接网络并允许用户从同一位置继续播放视频。换言之,每个回调都支持您执行适合给定状态变更的特定作业。在合适的时间执行正确的作业,并妥善处理转换,这将提升应用的稳健性和性能。例如,良好的生命周期回调实现有助于防止应用出现以下问题:
– 当用户在使用应用时接听来电,或切换至另一应用时崩溃。
– 当用户未主动使用它时,消耗宝贵的系统资源。
– 当用户离开应用并在稍后返回时,丢失用户的进度。
– 当屏幕在横向和纵向之间旋转时,崩溃或丢失用户的进度。
- 为了在Activity生命周期各个阶段之间导航转换,Activity类提供六个核心回调方法:onCreate()、onStart()、onResume()、onPause()、onStop() 和 onDestroy()。当 Activity 进入新状态时,系统会调用其中每个回调方法。
i、Activity存在与否
- Activity整个生命周期从onCreate()方法开始,到最终调用onDestroy()方法结束。对于Activity的全局资源在onCreate()方法中设置,最终在onDestroy()方法中进行资源回收。
ii、Activity可见与否
- Activity触发onStart()方法后处于可见状态,但未必能与用户进行交互。当Activity完全不可见时,触发onStop()方法。重新可见时,先触发onRestart()方法,再触发onStart()方法。onStart()方法和onStop()方法可以被多次调用。
iii、Activity可交互与否
- Activity在onResume()方法和onPause()方法之间时处于活动状态,此时可以与用户进行交互。
b、Activity生命周期回调方法
i、onCreate()回调方法
onCreate
方法是 Activity 生命周期的第一个方法,即在 Activity 被创建时被调用。它的执行标志着 Activity 的启动过程中的第一个重要步骤,用于完成一些初始化设置和布局加载工作。
主要作用
设置布局:通过调用 setContentView 方法来加载指定的布局文件,将界面内容展示给用户。
初始化视图:通过 findViewById 等方法找到布局中的各种控件(如按钮、文本框等),并将其存储为类成员变量或局部变量。
绑定事件监听器:为界面上的各种控件(如按钮)设置监听器,以响应用户的交互动作。
获取数据:从 Intent 中获取启动 Activity 时传递过来的数据,或者通过其他方式初始化界面需要的数据。
进行其他初始化工作:根据应用程序的需求进行其他的初始化工作,例如设置默认值、创建数据库连接等。
ii、onStart()回调方法
- onCreate() 退出后,Activity 将进入“已启动”状态,并对用户可见。此回调包含 Activity 进入前台与用户进行互动之前的最后准备工作。
iii、onResume()回调方法
- 系统会在 Activity 开始与用户互动之前调用此回调。此时,该 Activity 位于 Activity 堆栈的顶部,并会捕获所有用户输入。应用的大部分核心功能都是在 onResume() 方法中实现的。
- onResume() 回调后面总是跟着 onPause() 回调。
iv、onPause()回调方法
当 Activity 失去焦点并进入“已暂停”状态时,系统就会调用 onPause()。
例如,当用户点按“返回”或“最近使用的应用”按钮时,就会出现此状态。当系统为您的 Activity 调用 onPause() 时,从技术上来说,这意味着您的 Activity 仍然部分可见,但大多数情况下,这表明用户正在离开该 Activity,该 Activity 很快将进入“已停止”或“已恢复”状态。
如果用户希望界面继续更新,则处于“已暂停”状态的 Activity 也可以继续更新界面。例如,显示导航地图屏幕或播放媒体播放器的 Activity 就属于此类 Activity。即使此类 Activity 失去了焦点,用户仍希望其界面继续更新。
您不应使用 onPause() 来保存应用或用户数据、进行网络呼叫或执行数据库事务。有关保存数据的信息,请参阅保存和恢复 Activity 状态。
onPause() 执行完毕后,下一个回调为 onStop()或 onResume(),具体取决于 Activity 进入“已暂停”状态后发生的情况。
v、onStop()回调方法
当 Activity 对用户不再可见时,系统会调用 onStop()。出现这种情况的原因可能是 Activity 被销毁,新的 Activity 启动,或者现有的 Activity 正在进入“已恢复”状态并覆盖了已停止的 Activity。在所有这些情况下,停止的 Activity 都将完全不再可见。
系统调用的下一个回调将是 onRestart()(如果 Activity 重新与用户互动)或者 onDestroy()(如果 Activity 彻底终止)。
vi、onRestart()回调方法
- 当处于“已停止”状态的 Activity 即将重启时,系统就会调用此回调。onRestart() 会从 Activity 停止时的状态恢复 Activity。
- 此回调后面总是跟着 onStart()。
vii、onDestroy()回调方法
- 系统会在销毁 Activity 之前调用此回调。
- 此回调是 Activity 接收的最后一个回调。通常,实现 onDestroy() 是为了确保在销毁 Activity 或包含该 Activity 的进程时释放该 Activity 的所有资源。
vii、回调方法流程图
3)res
1、drawable
用于存放各种图文件,(.png,.jpg,.9png,.gif等)除此之外可能是一些其他的drawable类型的XML文件
2、layout
此目录是布局的目录,可以看到整个APP的布局和一些屏幕适配
a、LinearLayout 线性布局
LinearLayout是一个视图容器,用于使所有子视图在单个方向(垂直或水平)保持对齐,默认是控件(子视图)水平方向排列。
可以视图容器标签内使用android:orientation属性指定布局方向。
android:orientation="horizontal"时,也是此属性的默认值
- 属性及其含义
orientation | 布局中组件的排列方式 |
gravity | 控制组件所包含的子元素的对齐方式,可多个组合 |
layout_gravity | 控制该组件在父容器里的对其方式 |
background | 为该组件设置一个背景图片,或者是直接用颜色覆盖 |
divider | 分割线(可用view代替 高1dp) |
showDividers | 设置分割线所在的位置,none(无),beginning(开始),end(结束),middle(每两个组件间) |
dividerPadding | 设置分割线的 padding |
layout_weight | (权重)该属性是用来等比例的划分剩余区域 |
线性布局layout设置如下:
<LinearLayout //布局方式为线性布局
xmlns:android="http://schemas.android.com/apk/res/android" //匹配命令是否正确
android:layout_width="match_parent" //宽
android:layout_height="match_parent" //高
android:orientation="horizontal" // 设置线性方向vertical为垂直hor...为水平
</LinearLayout>
android:layout_weight="0" //控件中设置权重,设置屏幕占比,该控件占自己权重/总权重数
b、RelativeLayout 相对布局
RelativeLayout也是一个视图容器。
这意味着其中的所有控件如果不进行具体的位置确定,都将汇集在左上角(默认),存在叠图现象。
相对布局:子视图可通过设置相应的布局属性,设定相对于另一个兄弟视图或父容器视图的相对位置
相对于兄弟元素
属性名称 | 属性含义 |
---|---|
android:layout_below=“@id/aaa” | 在指定View的下方 |
android:layout_above=“@id/aaa” | 在指定View的上方 |
android:layout_toLeftOf=“@id/aaa” | 在指定View的左边 |
android:layout_toRightOf=“@id/aaa” | 在指定View的右边 |
android:layout_alignTop=“@id/aaa” | 与指定View的上边界一致 |
android:layout_alignBottom=“@id/aaa” | 与指定View下边界一致 |
android:layout_alignLeft=“@id/aaa” | 与指定View的左边界一致 |
android:layout_alignRight=“@id/aaa” | 与指定View的右边界一致 |
相对于父元素
属性名称 | 属性含义 |
---|---|
android:layout_alignParentLeft=“true” | 在父元素内左边 |
android:layout_alignParentRight=“true” | 在父元素内右边 |
android:layout_alignParentTop=“true” | 在父元素内顶部 |
android:layout_alignParentBottom=“true” | 在父元素内底部 |
对齐方式
属性名称 | 属性含义 |
---|---|
android:layout_centerInParent=“true” | 居中布局 |
android:layout_centerVertical=“true” | 垂直(竖向)居中布局 |
android:layout_centerHorizontal=“true” | 水平(横向)居中布局 |
间隔
属性名称 | 属性含义 |
---|---|
android:layout_marginBottom=“” | 指定该属性所在控件距下部最近控件(父容器视图或兄弟视图)的最小值 |
android:layout_marginLeft=“” | 指定该属性所在控件距左边最近控件(父容器视图或兄弟视图)的最小值 |
android:layout_marginRight =“” | 指定该属性所在控件距右边最近控件(父容器视图或兄弟视图)的最小值 |
android:layout_marginTop=“” | 指定该属性所在控件距上部最近控件(父容器视图或兄弟视图)的最小值 |
android:layout_paddingBottom=“” | 往内部元素底边缘填充距离 |
android:layout_paddingLeft=“” | 往内部元素左边缘填充距离 |
android:layout_paddingRight =“” | 往内部元素右边缘填充距离 |
android:layout_paddingTop=“” | 往内部元素上边缘填充距离 |
c、AbsoluteLayout 绝对布局
Android:layout_x //x坐标
Android:layout_y //y坐标
<AbsoluteLayout //决对布局
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
d、TableLayout 表格布局
默认占用一行
android:collapseColumns | 设置需要被隐藏的列的序号,从0开始设置 |
android:stretchColumns | 允许被拉伸的列的列序号,从0开始 |
android:shrinkcolumns | 设置允许被收缩的列的列序号,从0开始 |
android:layout_column | 显示在第几列 |
android:layout_span | 横向跨几列 |
e、GridLayout (比表格布局更灵活)
网络布局:默认情况下所有控件,显示到一列里面,水平排列。
android:orientation | 设置水平显示还是垂直显示 |
android:columnCount | 设置行的显示个数 |
android:rowCount | 设置列的显示个数 |
子控件属性
android:layout_column | 显示在第几列 |
android:layout columnSpan | 横向跨几列 |
android:layout_columnWeight | 横向剩余空间分配方式 |
android:layout_gravity | 在网格中的显示位置 |
android:layout_row | 显示在第几行 |
android:layout rowSpan | 横向跨几行 |
android:layout_rowWeight | 纵向剩余空间分配方式 |
f、 FrameLayout 帧布局、ConstraintLayout 约束布局
帧布局、约束布局不太常用,用到的时候再总结
3、menu
顾名思义是菜单相关的,因为现在基本都是全面屏的手机,所以我们需要在APK的内部进行一些一些菜单设置,都会在这个目录里面
4、mipmap
mipmap目录用于存放一些不同分辨率的图像:
- mipmap文件夹:这个文件夹用于存放不同分辨率的启动图标。当应用启动时,系统会根据设备的屏幕密度来选择合适的图标资源,这样可以保证图标在不同分辨率的设备上都能清晰显示。
- 分辨率目录:Android系统提供了多个分辨率目录,如hdpi(高密度)、mdpi(中等密度)、xhdpi(超高密度)、xxhdpi(极高密度)等。开发者可以将相同名称的图片放在这些不同的目录下,图片的尺寸和像素会根据目录的密度级别进行调整。
- 资源选择原则:如果某个分辨率目录下缺少资源,系统会寻找最接近的密度级别来加载资源。例如,如果ldpi目录下没有资源,系统会加载hdpi目录下的资源;如果ldpi和hdpi目录下都有资源,但mdpi目录下没有,系统会加载mdpi目录下的资源。
- 禁止自动选择:如果开发者不希望系统根据屏幕密度自动选择资源,可以在AndroidManifest.xml文件中添加android:anyDensity="false"属性。这样,系统就不会根据设备的屏幕密度来选择不同目录下的资源,而是会使用指定的资源。
mipmap-hdpi:高分辨率,一般我们把图片丢这里
mipmap-mdpi:中等分辨率,很少,除非兼容的的手机很旧
mipmap-xhdpi:超高分辨率,手机屏幕材质越来越好,以后估计会慢慢往这里过渡
mipmap-xxhdpi:超超高分辨率,这个在高端机上有所体现
5、value目录
也算是一个很重要的目录,因为一些资源的样子、颜色都会在这个里面进行设置
demens.xml | 定义尺寸资源 |
string.xml | 定义字符串资源 |
styles.xml | 定义样式资源 |
colors.xml | 定义颜色资源 |
arrays.xml | 定义数组资源 |
attrs.xml | 自定义控件时用的较多,自定义控件的属性 |
theme主题文件,和styles很相似,但是会对整个应用中的Actvitiy或指定Activity起作用,一般是改变窗口外观的!可在Java代码中通过setTheme使用,或者在Androidmanifest.xml中为<application…>添加theme的属性!
6、RAW目录
用于存放各种原生资源(音频,视频,一些XML文件等),我们可以通过openRawResource(int id)来获得资源的二进制流!
三、重要文件
1)MainActivity.java文件(文件名可不同)
MainActivity.java 相当于是开始,从这里引用包,重写副类这些,
MainActivity.java是程序运行的主代码区,这里可以引入activity_main.xml中声明的控件button等,也可以通过intent(意图)向其他activity申请实现活动之间的交互,也就是手机页面的跳转,通过AndroidManifest.xml里面intent-filter过滤器的筛选看是哪个别的activity进行响应处理,也就是跳转到哪个页面。
2)activity_main.xml文件
activity_main.xml 其实就相当于一个布局文件的XML配置,这里面去设置一些按钮大小位置等等。
3)AndroidManifest.xml 配置文件
用于储存本项目的活动及其对应响应处理方式。
四、参考文章
android studio学习(1)-整体框架数理_android studio框架-CSDN博客
关于AndroidStudio中的onCreate方法-CSDN博客
Android studio - 布局_android studio怎么切换布局-CSDN博客